我有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
答案 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
a
或b
的记录,然后声明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)
上的索引。
我应该强调,我非常喜欢蒂姆的聚合解决方案。我提出这个问题是因为在评论中提到了表现。 intersect
和group by
都会花费精力进行聚合(在第一种情况下,删除重复项,在第二种情况下明确)。这样的方法不会产生这种成本 - 假设具有唯一父ID的表可用。