如何从表中的所有列中找到最小值?

时间:2014-07-24 10:58:35

标签: android sqlite

我正在开发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的第一个问题,所以如果我错过了一些重要信息,请告诉我们:)

2 个答案:

答案 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;

An SQLfiddle to test all of them

答案 1 :(得分:-1)

使用此方法查找最小值

database_instance.rawQuery("SELECT MIN(coloumn1_name) FROM table_name",null);

同样为coloumn2和3