[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.
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.당신은 적어도 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.이 같은 두 개의 중첩 서브 쿼리와 ..
이 같은 두 개의 중첩 서브 쿼리와 ..
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.
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.이 대안은 당신이 찾고있는 관계의 양의 상수 문 구조의 이익과 하나 개의 매개 변수, 독립있다 :
이 대안은 당신이 찾고있는 관계의 양의 상수 문 구조의 이익과 하나 개의 매개 변수, 독립있다 :
SELECT parent_id FROM rel GROUP BY parent_id HAVING GROUP_CONCAT(prop_id ORDER BY prop_id ASC SEPARATOR ",") = '1,5';
단점 :
-
==============================
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.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.이 쿼리는 (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.이 당신을 도울 것입니다 희망 :
이 당신을 도울 것입니다 희망 :
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.당신은에 의해 그룹과이 작업을 수행 할 수 있습니다.
당신은에 의해 그룹과이 작업을 수행 할 수 있습니다.
SELECT PARENT_ID link_tbl FROM WHERE PROP_ID IN (5,1) GROUP BY PARENT_ID COUNT를 갖는 (*) = 2
from https://stackoverflow.com/questions/14113267/sql-select-only-rows-where-exact-multiple-relationships-exist by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 안드로이드 cursor.moveToNext ()? (0) | 2020.07.06 |
---|---|
[SQL] 안드로이드 - 어떻게 내 응용 프로그램에서 만든 SQL 데이터베이스를 볼 수 있나요? 나는 이클립스에서 안드로이드 에뮬레이터를 실행 해요 (0) | 2020.07.06 |
[SQL] 결정 요인 및 후보 키 동일하거나 다른 일이 있습니까? (0) | 2020.07.06 |
[SQL] 데이터베이스 오브젝트가 이미 존재하기 때문에 업데이트-Database 명령은 ASP.Net 코어 / 엔티티 프레임 워크 코어에서 작동하지 않습니다 (0) | 2020.07.06 |
[SQL] LINQ 조합 사용? (0) | 2020.07.06 |