복붙노트

[SQL] 목록에있는 모든 항목과 일치하는 행의 선택 그룹

SQL

목록에있는 모든 항목과 일치하는 행의 선택 그룹

나는 두 개의 테이블이 있다고 가정 :

자동차 - 자동차의 목록

carname | modelnumber | ...

passedtest - 자동차가 통과하는 모든 테스트가 포함되어 있습니다

id | carname | testtype | date | ...
1  | carA    | A        | 2000 |
2  | carB    | C        | 2000 |
3  | carC    | D        | 2001 |
4  | carA    | C        | 2002 |

자, 어떻게 모든 테스트 (A, B, C, D)을 전달 passedtest 테이블에서 차를 선택할 수 있습니다?

나는 IN 문을 시도했지만 그것도 단 한 테스트를 통과 차량과 일치합니다. 나는 모든 행에 걸쳐 목록에있는 모든 값과 일치하는 성명을 찾고 있는데요.

해결법

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

    1.이건 어때?

    이건 어때?

    SELECT carname
    FROM PassedTest
    GROUP BY carname
    HAVING COUNT(DISTINCT testtype) = 4
    

    또한 자동차 테이블에서 정보를 복용 내부 문으로 사용할 수 있습니다 :

    SELECT *
    FROM cars
    WHERE carname IN (
        SELECT carname
        FROM PassedTest
        GROUP BY carname
        HAVING COUNT(DISTINCT testtype) = 4
    )
    
  2. ==============================

    2.이러한 유형의 문제는 관계 부문이라고합니다.

    이러한 유형의 문제는 관계 부문이라고합니다.

    SELECT  a.*
    FROM    Cars a
            INNER JOIN
            (
                SELECT  CarName
                FROM    PassedTest 
                WHERE   testType IN ('A', 'B', 'C', 'D')
                GROUP   BY CarName
                HAVING  COUNT(*) = 4
            ) b ON a.CarName = b.CarName
    

    DISTINCT 키워드 PassedTest 테이블의 모든 CarName에 대해는 TestType에 적용하지이었다 UNIQUE 제약 조건이 COUNT에 필요한 경우 ()에만 고유 한 값을 계산합니다 그래서.

    SELECT  a.*
    FROM    Cars a
            INNER JOIN
            (
                SELECT  CarName
                FROM    PassedTest 
                WHERE   testType IN ('A', 'B', 'C', 'D')
                GROUP   BY CarName
                HAVING  COUNT(DISTINCT TestType) = 4
            ) b ON a.CarName = b.CarName
    

    당신은 단지 다음 CARNAME에 관심이 있다면 그러나 당신은 테이블을 조인 할 필요가 없습니다. 테이블 PassedTest에 쿼리하여 사용자의 요구에 맞게됩니다.

    SELECT  CarName
    FROM    PassedTest 
    WHERE   testType IN ('A', 'B', 'C', 'D')
    GROUP   BY CarName
    HAVING  COUNT(*) = 4
    
  3. ==============================

    3.당신은 관계 부서, SQL에서 구현되지 않는 작업을 수행합니다. 여기에서 우리는 제품 공급 업체 테이블과 필요한-제품 테이블이 예입니다 :

    당신은 관계 부서, SQL에서 구현되지 않는 작업을 수행합니다. 여기에서 우리는 제품 공급 업체 테이블과 필요한-제품 테이블이 예입니다 :

    CREATE TABLE product_supplier (
        product_id int NOT NULL,
        supplier_id int NOT NULL,
        UNIQUE (product_id, supplier_id)
    );
    INSERT INTO product_supplier (product_id, supplier_id) VALUES
    (1, 1),
    (2, 1),
    (3, 1),
    (1, 2),
    (2, 2),
    (3, 2),
    (4, 2),
    (2, 3),
    (3, 3),
    (4, 3);
    
    CREATE TABLE reqd (
        product_id int NOT NULL,
        UNIQUE (product_id)
    );
    INSERT INTO reqd (product_id) VALUES
    (1),
    (2),
    (3);
    

    ... 우리는 공급 모든 제품 아마 다른 사람을 요구하는 모든 공급 업체를 찾고 싶어요. 상기 예에서의 결과는, 공급 업체 1, 2 일 것이다.

    가장 똑바로 앞으로 해결책은 이것이다 :

    SELECT product_supplier.supplier_id
    FROM product_supplier
    LEFT JOIN reqd ON product_supplier.product_id = reqd.product_id
    GROUP BY product_supplier.supplier_id
    HAVING COUNT(reqd.product_id) = (SELECT COUNT(*) FROM reqd);
    
    +-------------+
    | supplier_id |
    +-------------+
    |           1 |
    |           2 |
    +-------------+
    

    우리가 공급하는 모든 제품을 요구하는 모든 공급 업체와 전혀 다른 사람 (정확한 사업부 / 아니오 나머지를) 찾으려면 그리고 위에 또 하나의 조건을 추가 :

    SELECT product_supplier.supplier_id
    FROM product_supplier
    LEFT JOIN reqd ON product_supplier.product_id = reqd.product_id
    GROUP BY product_supplier.supplier_id
    HAVING COUNT(reqd.product_id) = (SELECT COUNT(*) FROM reqd)
    AND COUNT(product_supplier.product_id) = (SELECT COUNT(*) FROM reqd);
    
    +-------------+
    | supplier_id |
    +-------------+
    |           1 |
    +-------------+
    

    필요한 제품이 존재하지 않는 선택 공급 업체는 공급 업체가 제공하는 제품에 존재하지 않는 : 또 다른 해결책은 문제를 바꿔하는 것입니다. 흠 :

    SELECT DISTINCT supplier_id
    FROM product_supplier AS ps1
    WHERE NOT EXISTS (
        SELECT *
        FROM reqd
        WHERE NOT EXISTS (
            SELECT *
            FROM product_supplier AS ps2
            WHERE ps1.supplier_id = ps2.supplier_id AND ps2.product_id = reqd.product_id
        )
    );
    
    +-------------+
    | supplier_id |
    +-------------+
    |           1 |
    |           2 |
    +-------------+
    
  4. from https://stackoverflow.com/questions/15977126/select-group-of-rows-that-match-all-items-in-a-list by cc-by-sa and MIT license