SQL使用条件两次查询同一个表

时间:2018-06-08 13:30:53

标签: sql

我有1张桌子

表包含以下内容:

implicit class UsableInt(i: Int) extends CanUse{
   def use() = i
}

我只需要返回comp_item为a和b的parent_items 所以我应该得到:

ID, parent_item, Comp_item
1, 123, a
2, 123, b
3, 123, c
4, 456, a
5, 456, b
6, 456, d
7, 789, b
8, 789, c
9, 789, d
10, a, a
11, b, b
12, c, c
13, d, d

3 个答案:

答案 0 :(得分:8)

这是一种规范的方法:

SELECT parent_item
FROM yourTable
WHERE Comp_item IN ('a', 'b')
GROUP BY parent_item
HAVING COUNT(DISTINCT Comp_item) = 2

此处的想法是按parent_item汇总,仅限制Comp_item ab的记录,然后声明Comp_item的不同数量}值是2。

答案 1 :(得分:1)

或者您可以使用INTERSECT

select parent_item from my_table where comp_item = 'a'
intersect
select parent_item from my_table where comp_item = 'b';

答案 2 :(得分:1)

如果您有父项目表,最有效的方法可能是:

select p.*
from parent_items p
where exists (select 1 from t1 where t1.parent_id = p.parent_id and t1.comp_item = 'a') and
      exists (select 1 from t1 where t1.parent_id = p.parent_id and t1.comp_item = 'b');

为获得最佳性能,您需要t1(parent_id, comp_item)上的索引。

我应该强调,我非常喜欢蒂姆的聚合解决方案。我提出这个问题是因为在评论中提到了表现。 intersectgroup by都会花费精力进行聚合(在第一种情况下,删除重复项,在第二种情况下明确)。这样的方法不会产生这种成本 - 假设具有唯一父ID的表可用。