17

与えられた親テーブル'親'

╔═══════════╦══════════╗
║ 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完全に複数の関係が存在する行のみを選択してください

4

4 に答える 4

19

これはリレーショナル部門と呼ばれます

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_idparent_idDISTINCT

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
于 2012-12-31T06:26:43.393 に答える
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
于 2012-12-31T06:39:13.717 に答える
1

最初のテーブルにa、2番目のテーブルに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)
于 2012-12-31T06:29:55.207 に答える
1

私はちょうどこの場合に合うように思われる別の質問に対するこの解決策を見ました:

 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'
于 2012-12-31T06:32:25.783 に答える