【发布时间】:2016-09-10 15:24:22
【问题描述】:
我的数据库中有下表:
ID name
1 x
2 x
3 y
1 y
1 z
现在我只想选择同时具有“x”和“y”值标签名称的对象(ID)。在这种情况下,这将仅是 ID = 1 的记录,因为搜索的值集('x' 和 'y')是此记录可能名称集('x'、'y' 和 'z')的子集。
如何编写 SQL 查询?
感谢您的帮助 :)
【问题讨论】:
我的数据库中有下表:
ID name
1 x
2 x
3 y
1 y
1 z
现在我只想选择同时具有“x”和“y”值标签名称的对象(ID)。在这种情况下,这将仅是 ID = 1 的记录,因为搜索的值集('x' 和 'y')是此记录可能名称集('x'、'y' 和 'z')的子集。
如何编写 SQL 查询?
感谢您的帮助 :)
【问题讨论】:
一种方法使用聚合:
select id
from t
where name in ('x', 'y')
group by id
having count(*) = 2;
如果您关心性能,您可能希望将其与以下内容进行比较:
select id
from t tx join
t ty
on tx.id = ty.id and tx.name = 'x' and ty.name = 'y';
第一个版本更容易泛化到更多标签。在某些情况下,第二个可能有更好的性能。
【讨论】:
Name 与ID 相比不是唯一的,但如果ID 包含,则可以选择它相同name 值的倍数。第二个查询可能更理想。
count(distinct name) = 2。样本数据并不表明重复是一个问题。同样,如果name 可能是NULL,那么 OP 需要解释如何处理这些值。