복붙노트

[SQL] 정확한 배수 관계가 존재 SQL 만 선택 행

SQL

정확한 배수 관계가 존재 SQL 만 선택 행

이것은이 질문에 밀접하게 관련이 있지만, 또 다른 요구 사항을 추가합니다.

부모 테이블 '부모'주어

╔════════════╦════════╗
║ 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과 관계를 가진 모든 부모를 찾을 수 있습니까?

해결법

  1. ==============================

    1.

    SELECT PARENT_ID
    FROM rel
    GROUP BY PARENT_ID
    HAVING SUM(PROP_ID NOT IN (5,1)) = 0
    AND SUM(PROP_ID = 1) = 1 
    AND SUM(PROP_ID = 5) = 1
    
  2. ==============================

    2.당신은 적어도 5 1 모든 부모를 선택하려는 경우, 당신은 사용할 수 있습니다 :

    당신은 적어도 5 1 모든 부모를 선택하려는 경우, 당신은 사용할 수 있습니다 :

    SELECT PARENT_ID
    FROM rel
    GROUP BY PARENT_ID
    HAVING SUM(PROP_ID = 1)
           AND SUM(PROP_ID = 5)
           AND SUM(PROP_ID NOT IN (5,1)) = 0
    

    당신이 정확히 하나의 5 일 일을해야하는 경우,이 답변을 참조

  3. ==============================

    3.이 같은 두 개의 중첩 서브 쿼리와 ..

    이 같은 두 개의 중첩 서브 쿼리와 ..

     Select pa.Id
     From parents pa
     Where not exists -- This ensures that all specifies properties exist
        (Select * From property y
         Where propertyId In (1,5)
             And Not Exists
                 (Select * From parentProperty
                  Where parentId = pa.parentId 
                      And propertyId = y.propertyId ))
       And not exists -- This ensures that only specified list of properties exist
        (Select * From parentProperty
         Where parentId = pa.parentId 
            And propertyId Not In (1,5) )
    

    첫 번째 읽기 "지정된 부모의 부모의 속성 테이블에없는 속성의 지정된리스트의 속성이없는 경우 .... 나에게 모든 부모보기"

    두 번째 하위 쿼리 읽 "또한 지정된 목록에없는 모든 속성에 대한 그 부모의 parentProperties 테이블의 레코드가 존재하지 않음을 확인하십시오."

  4. ==============================

    4.

    SELECT PARENT_ID
    FROM rel
    GROUP BY PARENT_ID
    HAVING
      COUNT(PROP_ID)=2 AND
      COUNT(DISTINCT case when PROP_ID IN ( 1, 5 ) then PROP_ID end)=2
    

    이 비는 PROP_ID, 일치하는 중복 정확히 두 사람과 함께, 정확히 두 개의 행이 모든 PARENT_ID을 선택합니다.

  5. ==============================

    5.이 대안은 당신이 찾고있는 관계의 양의 상수 문 구조의 이익과 하나 개의 매개 변수, 독립있다 :

    이 대안은 당신이 찾고있는 관계의 양의 상수 문 구조의 이익과 하나 개의 매개 변수, 독립있다 :

    SELECT parent_id FROM rel 
    GROUP BY parent_id 
    HAVING GROUP_CONCAT(prop_id ORDER BY prop_id ASC SEPARATOR ",") = '1,5';
    

    단점 :

  6. ==============================

    6.(PARENT_ID, PROP_ID) 가정 고유 :

    (PARENT_ID, PROP_ID) 가정 고유 :

    SELECT r1.PARENT_ID
    FROM rel r1
    INNER JOIN rel r2 ON r1.PARENT_ID = r2.PARENT_ID AND r2.PROP_ID = 5 
    INNER JOIN rel r3 ON r1.PARENT_ID = r3.PARENT_ID AND r3.PROP_ID = 1
    GROUP BY r1.PARENT_ID
    HAVING COUNT(*) = 2
    

    또는,

    SELECT parent.PARENT_ID
    FROM parent
    INNER JOIN
    (
        SELECT PARENT_ID
        FROM rel
        WHERE PROP_ID IN (1,5)
        GROUP BY PARENT_ID
        HAVING COUNT(*) = 2
    ) good ON parent.PARENT_ID = good.PARENT_ID
    LEFT OUTER JOIN rel bad ON parent.PARENT_ID = bad.PARENT_ID 
        AND bad.PROP_ID NOT IN (1,5)
    WHERE bad.PARENT_ID IS NULL
    

    또는,

    SELECT DISTINCT parent.PARENT_ID
    FROM parent
    INNER JOIN rel r2 ON parent.PARENT_ID = r2.PARENT_ID AND r2.PROP_ID = 5 
    INNER JOIN rel r3 ON parent.PARENT_ID = r3.PARENT_ID AND r3.PROP_ID = 1
    LEFT OUTER JOIN rel r0 ON parent.PARENT_ID = r0.PARENT_ID 
        AND r0.PROP_ID NOT IN (1,5)
    WHERE r0.PARENT_ID IS NULL
    
  7. ==============================

    7.MySQL이 마이너스를 지원하는 경우 쿼리는 다음과 같이 수 :

    MySQL이 마이너스를 지원하는 경우 쿼리는 다음과 같이 수 :

    select parent_id
    from rel
    where prop_id in (5,1)
    group by parent_id
    having count(distinct prop_id)=2 and count(prop_id)=2
    minus
    select parent_id
    from rel
    where prop_id not in (5,1);
    

    초과하지 그 관계를 제거에서 (5,1), 예를 들어 (5,1,3).

    난 당신이 MySQL을 사용하고 내 대답은 따라서 잘못 알고있다. 그냥 다른 생각으로 가져 가라.

  8. ==============================

    8.이 쿼리는 (PARENT_ID, PROP_ID가) 고유하지 않은 경우에도 마찬가지입니다 :

    이 쿼리는 (PARENT_ID, PROP_ID가) 고유하지 않은 경우에도 마찬가지입니다 :

    SELECT PARENT_ID FROM rel WHERE
    PROP_ID IN (5,1) AND 
    PARENT_ID NOT IN (SELECT DISTINCT PARENT_ID FROM rel WHERE PROP_ID NOT IN (5,1))
    GROUP BY PARENT_ID HAVING COUNT(DISTINCT PROP_ID) = 2
    
  9. ==============================

    9.이 당신을 도울 것입니다 희망 :

    이 당신을 도울 것입니다 희망 :

    SELECT p.PARENT_ID , r.PROP_ID FROM rel r LEFT JOIN parent p ON p.PARENT_ID = r.PARENT_ID WHERE r.PROP_ID = 5 OR r.PROP_ID = 1
    
  10. ==============================

    10.당신은에 의해 그룹과이 작업을 수행 할 수 있습니다.

    당신은에 의해 그룹과이 작업을 수행 할 수 있습니다.

    SELECT PARENT_ID link_tbl FROM WHERE PROP_ID IN (5,1) GROUP BY PARENT_ID COUNT를 갖는 (*) = 2

  11. from https://stackoverflow.com/questions/14113267/sql-select-only-rows-where-exact-multiple-relationships-exist by cc-by-sa and MIT license