SQL Select only rows where multiple relationships exist

后端 未结 4 1109
北荒
北荒 2020-12-10 12:29

Given a parent table \'parent\'

╔═══════════╦══════════╗
║ PARENT_ID ║   NAME   ║
╠═══════════╬══════════╣
║         1 ║ bob      ║
║         2 ║ carol    ║
         


        
相关标签:
4条回答
  • 2020-12-10 12:49

    name your first table a, and second table 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)
    
    0 讨论(0)
  • 2020-12-10 13:03

    I just saw this solution to a different question that seems to fit this case:

     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'
    
    0 讨论(0)
  • 2020-12-10 13:05

    This is called Relational Division

    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
    
    • SQLFiddle Demo Link

    UPDATE 1

    if unique constraint was not enforce on prop_id for every parent_id, DISTINCT is needed on this case.

    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
    
    0 讨论(0)
  • 2020-12-10 13:07

    I've written your table in to a CTE, let me know if you require assistance in adapting the code for your purposes.

    ;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
    
    0 讨论(0)
提交回复
热议问题