[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.이건 어때?
이건 어때?
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.이러한 유형의 문제는 관계 부문이라고합니다.
이러한 유형의 문제는 관계 부문이라고합니다.
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.당신은 관계 부서, 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 | +-------------+
from https://stackoverflow.com/questions/15977126/select-group-of-rows-that-match-all-items-in-a-list by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL Server의 날짜 범위를 생성하는 방법 (0) | 2020.03.23 |
---|---|
[SQL] Tablefunc를 사용하여 여러 열에서 피벗 (0) | 2020.03.23 |
[SQL] "절에"내 항목의 MySQL의 수 (0) | 2020.03.23 |
[SQL] MySQL의 : 그룹 함수의 잘못된 사용 (0) | 2020.03.23 |
[SQL] SQL Server의 진수에서 0을 후행 제거 (0) | 2020.03.23 |