我正在开发Android应用,它要求我实现SQLite数据库(http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html)。我有一个包含多列的表格,所有列都包含 NUMBER 类型数据。我需要找到所有列的最小值。例如,如果我的表看起来像这样 -
Column1 Column2 Column3
======= ======= =======
1000 2000 1500
2000 4500 5000
500 2500 500
column1的最小值为500,column2为2000,column3为500.表中的总体最小值为500.要查找此值,我使用 UNION 子句。我的查询 -
SELECT MIN (a) FROM (
SELECT MIN (Column1) FROM MyTable
UNION
SELECT MIN (Column2) FROM MyTable
UNION
SELECT MIN (Column3) FROM MyTable
) AS a
上述查询使用rawQuery方法(http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#rawQuery%28java.lang.String,%20java.lang.String[]%29)
在我的应用程序中执行此查询似乎适用于Oracle SQL * Plus,但不适用于SQLite。根据我在Google上找到的一些教程,我的语法似乎是正确的。但是我在LogCat中收到错误 "没有这样的列:a" ,我的应用关闭了。
我真的很感激我的查询中哪些部分不正确。其他获得相同结果的方法也很受欢迎。
谢谢,
罗汉
注意:这是我关于StackOverflow的第一个问题,所以如果我错过了一些重要信息,请告诉我们:)
答案 0 :(得分:4)
您至少需要在联合中的第一个查询中命名您的列,否则它将在外部查询中没有名称a
;
SELECT MIN (a) AS a FROM (
SELECT MIN (Column1) AS a FROM MyTable
UNION
SELECT MIN (Column2) FROM MyTable
UNION
SELECT MIN (Column3) FROM MyTable
)
如果您的列单独编制索引或作为复合索引的第一个字段,使用MIN以这种方式将允许使用MIN/MAX optimisation(感谢@CL。),尽管我使用UNION ALL
而不是UNION
以避免DISTINCT
步骤。
作为备用版本,您可以一次使用MIN
。如果您的表未编入索引以使用上述优化,那么这应该与上面一样有效。
SELECT MIN(a) AS a FROM (
SELECT column1 AS a FROM MyTable
UNION ALL
SELECT column2 FROM MyTable
UNION ALL
SELECT column3 FROM MyTable
)
如果您愿意使用“SQLite-ism”,并且具有多个值的MIN
将获得最小值,那么还有一种更简洁的方法来获得结果。由于此查询包含多个MIN()
,因此它也不会使用MIN / MAX优化。
SELECT MIN( MIN(column1), MIN(column2), MIN(column3) ) AS a FROM MyTable;
答案 1 :(得分:-1)
使用此方法查找最小值
database_instance.rawQuery("SELECT MIN(coloumn1_name) FROM table_name",null);
同样为coloumn2和3