给定父表'父'
╔═══════════╦══════════╗
║ PARENT_ID ║ NAME ║
╠═══════════╬══════════╣
║ 1 ║ bob ║
║ 2 ║ carol ║
║ 3 ║ stew ║
╚═══════════╩══════════╝
和父和一个(这里未指定的)属性表之间的多对多关系表'rel'
╔═══════════╦═══════════╗
║ PARENT_ID ║ PROP_ID ║
╠═══════════╬═══════════╣
║ 1 ║ 5 ║
║ 1 ║ 1 ║
║ 2 ║ 5 ║
║ 2 ║ 4 ║
║ 2 ║ 1 ║
║ 3 ║ 1 ║
║ 3 ║ 3 ║
╚═══════════╩═══════════╝
如何选择所有所有指定关系的父母?例如。使用样本数据,我如何找到同时具有属性5和1的父母?
编辑: 同样的问题,但要求完全匹配: SQL Select only rows where exact multiple relationships exist
答案 0 :(得分:18)
SELECT a.name
FROM parent a
INNER JOIN rel b
ON a.parent_ID = b.parent_ID
WHERE b.prop_id IN (1,5)
GROUP BY a.name
HAVING COUNT(*) = 2
更新1
如果prop_id
对每个parent_id
强制执行唯一约束,则此案例需要DISTINCT
。
SELECT a.name
FROM parent a
INNER JOIN rel b
ON a.parent_ID = b.parent_ID
WHERE b.prop_id IN (1,5)
GROUP BY a.name
HAVING COUNT(DISTINCT b.prop_id) = 2
答案 1 :(得分:1)
为您的第一个表a命名,第二个表b
SELECT parent_id FROM prop b1
WHERE prop_id=1 and
EXISTS (SELECT parent_id FROM prop b2
WHERE b2.parent_id=b1.parent_id AND b2.prop_id=5)
答案 2 :(得分:1)
我刚看到这个问题solution似乎适合这种情况:
SELECT distinct parent_id
FROM rel as T1
INNER JOIN rel as T2
ON T1.parent_id = T2.parent_id
WHERE T1.prop_id = '1' and T2.prop_id = '5'
答案 3 :(得分:1)
我已将您的表格写入CTE,如果您需要协助调整代码以便达到目的,请告知我们。
;WITH MyTable AS
(
SELECT parent_id = 1
,prop_id = 5 UNION ALL
SELECT 1,1 UNION ALL
SELECT 2,5 UNION ALL
SELECT 2,4 UNION ALL
SELECT 2,1 UNION ALL
SELECT 3,1 UNION ALL
SELECT 3,3
)
,Eval AS
(
SELECT parent_id
,PropEval = SUM(CASE WHEN prop_id IN (1,5) THEN 1 ELSE 0 END)
FROM MyTable
GROUP BY parent_id
)
SELECT parent_id
FROM Eval
WHERE PropEval = 2