복붙노트

[SQL] SQL : 다 대다 테이블 및 쿼리

SQL

SQL : 다 대다 테이블 및 쿼리

첫째 - 퍼지 제목에 대한 사과, 내가 더 나은 하나를 찾을 수 없습니다.

나는 다음과 같은 구조 (단순화) 테이블이 있습니다

EmpID DeptID

1     1
1     2
2     1
3     2
4     5
5     2

이 테이블은 다 대다 관계를 나타냅니다.

나는 그것이 AND 관계가 아닌 OR 관계의 DeptIDs 1, 2, 3하십시오 노트에 관련된 모든 EmpIDs을 원하는 예를 들어 DeptIDs의 특정 그룹에 관련된 모든 EmpIDs을 찾는 데 관심이 있어요. 유효한 해답이 될 수 있도록 제 경우를 들어,다는 EmpID 1, 2, 3 외에 추가 DeptIDs 관련이있을 수 있습니다.

나는 변화에 관심이 DeptIDs의 수 (즉, 나는 DeptID 3, 5 모두에 관련하고 EmpIDs을 할 수 있습니다, 또는 나는 DepIDs 2, 3, 4, 5, 6, 7에 관련된 EmpIDs를 할 수 있습니다).

나는이 문제에 접근 할 때 나 자신 중 하나가 DepID 당 가입 만들거나 DeptID 당 하위 쿼리 찾을 수 있습니다. 이것은 내가에 대해 테스트하고있어 DeptIDs의 수에 따라 새 쿼리를 생성해야 의미 할 것입니다. 나는 분명히 매개 변수의 매개 변수 또는 세트 정적 쿼리를 가진 선호하는 것입니다.

나는 SQL 서버와 MySQL 모두 (내 코드의 병렬 두 가지 버전으로 개발)을 통해 일하고 있어요.

어떤 아이디어?

해결법

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

    1.난 당신이 훨씬 더 쉽게 쿼리입니다 부서의 모든에 지정된 모든 부서에있는 직원뿐 아니라 직원을 찾고 싶어요 있으리라 믿고있어.

    난 당신이 훨씬 더 쉽게 쿼리입니다 부서의 모든에 지정된 모든 부서에있는 직원뿐 아니라 직원을 찾고 싶어요 있으리라 믿고있어.

    SELECT EmpID
    FROM mytable t1
    JOIN mytable t2 ON t1.EmpID = t2.EmpID AND t2.DeptID = 2
    JOIN mytable t3 ON t2.EmpID = t3.EmpID AND t3.DeptID = 3
    WHERE DeptID = 1
    

    내가 사용 집계에 올 것입니다 피할 수없는 제안을 선점거야 :

    SELECT EmpID
    FROM mytable
    WHERE DeptID IN (1,2,3)
    GROUP BY EmpID
    HAVING COUNT(1) = 3
    

    그 유혹에 저항. 그것은 상당히 느리다. 대 "그룹에 의해 갖는"을 "참여"와 두 번째 버전은 20 배 느린에 대해, 그 두 번째에 있었다 - 이와 유사한 시나리오는 SQL 문에왔다.

    나는 또한 당신이 AppDevelopers에 의해 만들어 데이터베이스 개발 실수 보면 좋을 것.

  2. ==============================

    2.내가 좋아하는 일부터 시작 했죠 :

    내가 좋아하는 일부터 시작 했죠 :

    SELECT EmpID, COUNT(*) AS NumDepts
    FROM thetable
    WHERE DeptID IN (1, 2, 3)
    GROUP BY EmpId
    HAVING COUNT(*) == 3
    

    물론, 마지막 줄에 그 3는 항상 (그래서 2,3,4,5,6,7 (용)가 6 일 것)을있는 거 검사 부서 ID의 순서의 길이 될 것입니다. 이것은 "이 모든 부서에 연결된 직원"을 표현하는 하나의 자연적인 방법입니다.

    편집 : - 나는 적절한 지표로, SQLite는과 PostgreSQL에서이 방법을 시도했습니다, 그리고 그것을 잘 지수 모두의 적절한 사용이 말했다으로 수행하는 것처럼 거기 보이는 I는 성능 문제에 대한 다른 답변에 메모를 참조 나는 성능을 인정해야 5.0에 좋은대로 아무데도 없었다.

    나는 엄청나게 많은 엔진에 대한 벤치 마크이있는 기회없이 (의심 ;-) 같은 SQL 서버 2008, 오라클, IBM DB2, 새로운 오픈 소스 앵그르 ... 다른 정말 좋은 SQL 엔진은 ()이 쿼리를 최적화하는 것 물론, 다른 평범한 것들 동안되지 않습니다 (어디서나 가까운 MySQL의의에 대한 인기와 어떤 생각할 수 없다).

    그래서, 더 당신의 마음에 드는 대답은 당신이 정말로 걱정하는 어떤 엔진에 따라 달라집니다 의심하지 내 책임을 잘 수행하는 쿼리를 제공하기 위해 가정 된 구성 요소를 유지 팀을 관리 포함하는 경우 (이 전, 10 년간의 시간에 날 다시한다 를보다 대여섯 서로 다른 엔진에 비해 - 이야기 악몽 작업에 대한 ... -!).

  3. from https://stackoverflow.com/questions/1054299/sql-many-to-many-table-and-query by cc-by-sa and MIT license