将UNION查询简化为使用单个SELECT



数据:

我有一个sqlite表,其中包含以下示例行:

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

这很简单,如果groupId小于0,那么它是一个单独的元素,否则它在一个组中(即使groupId没有引用任何id s。

查询:

我想过滤groupId小于0并且不是selected的每个元素加上每组中的每个第一个元素。从该表中,id s: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语句。这个单独的语句可以使用任何东西,但不能使用聚合函数。

提前感谢您的回答!

不需要联合,所有这些都可以在一个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

最新更新