SQLite中的嵌套(或类似)

时间:2018-08-09 06:29:15

标签: android sqlite android-sqlite where-in

我想将多行返回为一行,由Android游标适配器处理。

我目前有一个带有日期列的表,我想将所有具有相同日期的行作为一行返回。

请考虑下表:

     ID |   Name   |   Date
 -------------------------------
      1 |  'Mark'  | '08/06/15'
      2 |  'Peter' | '08/06/15'
      3 |  'Henry' | '08/06/15'
      4 |  'Bob'   | '17/04/16'
      5 |  'Tony'  | '23/08/13'
      6 |  'Tim'   | '17/04/16'

我想查询结果如下:

         Date    |       Names
    ------------------------------------
      '08/06/15' | 'Mark, Peter, Henry'
      '17/04/16' | 'Bob, Tim'
      '23/08/13' | 'Tony'

使用this link,我可以获取以下查询:

SELECT t1.id, GROUP_CONCAT(t1.Name ) AS Names
FROM Table1 t1 JOIN Table2 t2 ON t1.ID = t2.ID
GROUP BY t1.ID;

但是,由于所有数据都来自同一张表,并且我事先知道要查询的日期,因此我希望对输入的数组使用JOIN并让SQLite对其进行解析(即,像innest in Postgres),就好像它来自实际表一样。

该数组将类似于:

['08/06/15', '17/04/16', '23/08/13', '09/08/18']

这也可以通过嵌套SQL查询来完成,但是我希望有一个优化的解决方案。

2 个答案:

答案 0 :(得分:0)

SQLite没有数组类型。

最简单的方法是使用IN operator

SELECT ID, group_concat(Name) AS Names
FROM MyTable
JOIN (VALUES('08/06/15'), ('17/04/16'), ('23/08/13'), ('09/08/18'))
  ON Date = column1
GROUP BY ID;

如果您确实要使用联接,则可以使用VALUES clause(在Android Jelly Bean或更高版本中)或复合查询来构造虚拟表:

SELECT ID, group_concat(Name) AS Names
FROM MyTable
JOIN (SELECT '08/06/15' AS Date UNION ALL
      SELECT '17/04/16'         UNION ALL
      SELECT '23/08/13'         UNION ALL
      SELECT '09/08/18'                  ) USING (Date)
GROUP BY ID;
Scaffold

答案 1 :(得分:0)

这是您想要的吗?

SELECT Date, group_concat(Name) AS Names
FROM table_name
GROUP BY Date;