【发布时间】:2011-01-04 17:58:36
【问题描述】:
我一直在用下面的代码查询一张表:
public Cursor fetchFilteredItemsNearSortedByDistance(String strTable, String[] strArrayFields, String strField, String strCriterion, double dblCentreEasting, double dblCentreNorthing, double dblRadius) {
String strSQL = "Easting > " + Double.toString(dblCentreEasting-dblRadius);
strSQL += " AND Easting < " + Double.toString(dblCentreEasting+dblRadius);
strSQL += " AND Northing > " + Double.toString(dblCentreNorthing-dblRadius);
strSQL += " AND Northing < " + Double.toString(dblCentreNorthing+dblRadius);
strSQL += " AND " + strField + " LIKE '%" + strCriterion + "%'";
strSQL += " ORDER BY ";
strSQL += "((Easting - " + Double.toString(dblCentreEasting)+")";
strSQL += " * (Easting - " + Double.toString(dblCentreEasting)+")";
strSQL += " + (Northing - " + Double.toString(dblCentreNorthing)+")";
strSQL += " * (Northing - " + Double.toString(dblCentreNorthing)+"))";
strSQL += " COLLATE NOCASE";
return myDbHelper.myDataBase.query(strTable, strExtendedArrayFields, strSQL, null, null, null, null);
}
以上代码运行良好。但是,我现在想将这个想法扩展到两个或多个表的 UNION,并尝试了以下代码:
public Cursor fetchFilteredPOIsNearSortedByDistance(String strTable, String[] strArrayFields, String strField, String strCriterion, double dblCentreEasting, double dblCentreNorthing, double dblRadius) {
String strSQL = "SELECT * FROM TableA ";
strSQL += "UNION SELECT * FROM TableB ";
strSQL += "WHERE ( Easting > " + Double.toString(dblCentreEasting-dblRadius);
strSQL += " AND Easting < " + Double.toString(dblCentreEasting+dblRadius);
strSQL += " AND Northing > " + Double.toString(dblCentreNorthing-dblRadius);
strSQL += " AND Northing < " + Double.toString(dblCentreNorthing+dblRadius);
strSQL += " AND " + strField + " LIKE '%" + strCriterion + "%' ) ";
strSQL += " ORDER BY ";
strSQL += "((Easting - " + Double.toString(dblCentreEasting)+")";
strSQL += " * (Easting - " + Double.toString(dblCentreEasting)+")";
strSQL += " + (Northing - " + Double.toString(dblCentreNorthing)+")";
strSQL += " * (Northing - " + Double.toString(dblCentreNorthing)+"))";
strSQL += " COLLATE NOCASE";
return myDbHelper.myDataBase.rawQuery(strSQL, null);
}
但是,这会产生“SQLiteException: 1st ORDER BY term does not match any column in the result set”错误。
LogCat 中的完整错误是:
ERROR/AndroidRuntime(11444): Caused by: android.database.sqlite.SQLiteException: 1st ORDER BY term does not match any column in the result set: , while compiling: SELECT * FROM TableA UNION SELECT * FROM TableB WHERE ( Easting > 594378.8427734375 AND Easting < 663822.8427734375 AND Northing > 127586.046875 AND Northing < 197030.046875 AND Name LIKE '%%' ) ORDER BY ((Easting - 629100.8427734375) * (Easting - 629100.8427734375) + (Northing - 162308.046875) * (Northing - 162308.046875)) COLLATE NOCASE
谁能帮我走上正确的道路,好吗?
【问题讨论】:
-
是您要在 TableA 中排序的字段还是仅在 tableB 中排序的字段
-
TableA 和 TableB 都包含地理相关的数据项……每个表都有一个 Easting 和 Northing 字段(大致相当于经度和纬度)。排序顺序是距中心点的距离,因此通过从每行获取东距和北距,将计算字段应用于两个表中的每一行。
-
嗯,这与您的问题无关。但是,最好使用 StringBuilder 而不是 string += string 操作。只是一个好的做法(如果您需要在应用中频繁执行这些操作,则会获得巨大的性能提升)
-
感谢您的建议,Sarwar。
标签: sql android sqlite union calculated-columns