1

数据:

我有一个带有以下示例行的 sqlite 表:

+-------------+----------------+-----------------+
| id          | groupId        | selected        |
+-------------+----------------+-----------------+
|           1 | -1             | 0               |
|           2 | 2              | 0               |
|           3 | 2              | 1               |
|           4 | 5              | 0               |
+-------------+----------------+-----------------+

这很简单,如果groupId小于 0,则它是单个元素,否则它在一个组中(即使sgroupId没有引用任何ids.

查询:

我想过滤groupId小于 0 的每个元素,而不是selected每个组中的每个第一个元素。从此表中,ids:1、2 和 4。

当前的解决方案UNION

SELECT * FROM (SELECT * FROM Elements WHERE (groupId < 0 AND selected = 0 ) UNION SELECT * FROM Elements WHERE groupId >= 0 GROUP BY groupId)

目标:

我想将查询更改为仅使用一条SELECT语句。该单一语句可以使用任何东西,但聚合函数除外。

提前感谢您的回答!

4

1 回答 1

1

不需要联合,所有这些都可以在一个 WHERE 子句中完成。这是将返回您请求的 ID 列表的查询。

SELECT  MIN_ID
FROM    (
        SELECT  GROUPID
                ,MIN(ID) AS MIN_ID
        FROM    ELEMENTS
        WHERE   (GROUPID < 0 AND SELECTED = 0)
        OR      GROUPID >= 0
        GROUP BY
                GROUPID
        )

这是基于以下评论的第二个查询。

SELECT  GROUPID
        ,MIN(ID) AS MIN_ID
FROM    ELEMENTS
WHERE   (GROUPID < 0 AND SELECTED = 0)
OR      GROUPID >= 0        
GROUP BY
        GROUPID
于 2013-08-07T20:16:20.893 回答