我试图解决这个问题已经有一段时间了,但无济于事!
问题
考虑下面给出的有几个子集(即3个子集)的集合:
问题
无论如何我可以选择排除 SUB3?
我尝试过很多内容,例如:LEFT JOIN
,JOIN
,NOT IN
,NOT EXISTS
以及更多SELECT
个子查询。
SELECT
t1.*, t2.*
FROM
table AS t1
LEFT JOIN
table AS t2 ON t1.id = t2.id
WHERE
t1.attribute = 'COLLECTION'
AND t2.attribute = 'SUB3'
AND oa2.id IS NULL;
注意
请注意,table
包含大约7500万个条目(行),我希望能有一些快速的东西!
更新
示例
+-----+-------------+
| id | attribute |
+-----+-------------+
| 1 | vehicle |
| 1 | bus |
| 2 | vehicle |
| 2 | car |
| 3 | vehicle |
| 3 | truck |
+-----+-------------+
Of course there is a second incremental id to avoid duplicate issues!
因此在这个例子中,我想要除truck
之外的所有车辆!
请告知,
感谢
答案 0 :(得分:1)
如果您想获得没有id
的{{1}},那么您可以使用attribute = 'SUB3'
和group by
来解决此问题:
having
select t.id
from table t
where t.attribute = 'COLLECTION'
group by t.id
having sum(t.attribute = 'COLLECTION' AND t.attribute = 'SUB3') = 0
子句是可选的,但它可以提高性能。
答案 1 :(得分:1)
使用NOT EXISTS删除所有不需要的元素
SELECT *
FROM table t
WHERE t.attribute = 'COLLECTION'
AND NOT EXISTS ( SELECT 'a'
FROM table t2
WHERE t2.id = t.id
AND t2.attribule = 'SUB3'
)