2009-12-15 3 views
1

설치 : 주문에 여러 개의 샘플이 있고 각 샘플에는 테스트가 있습니다. 특정 테스트 조합은 특정 테스트 코드입니다. 특정 값을 가진 행 세트를 특정 값의 다른 테이블과 일치 시키면 어떻게 하나의 결과를 얻을 수 있습니까?TSQL : 한 테이블의 값 집합이 다른 테이블의 값 집합과 일치하는 값 검색

테이블 : TestCodes

 
ID  TestCode Test 
1  01a  A 
2  01b  F 
3  02a  A 
4  02a  B 
5  02b  A 
6  02b  C 
7  02c  A 
8  02c  E 
9  03a  A 
10  03a  C 
11  03a  B 
12  03a  D 
13  03b  A 
14  03b  C 
15  03b  E 
16  03c  A 
17  03c  B 
18  03c  E 
19  04  A 
20  04  C 
21  04  B 
22  04  D 
23  04  E 

테이블 : 내가 TSQL보기를 시도했습니다

 
Order TestCode 
1  04 
2  02c 

을 반환하는 방법을 찾을 수 없습니다

 
Order Sample Test 
1  1  A 
1  2  B 
1  3  C 
1  4  D 
1  5  E 
2  1  A 
2  2  E 

주문하지만, '수 한 테이블의 값 집합과 다른 테이블의 값 집합을 비교하는 방법을 찾습니다. 오 순서에서

+0

문제는 그 결과를 얻기 위해 필요한 기준을 정의하는 것입니다. 하나의 리턴 04를 기록하고 record2는 02C를 리턴합니까? – HLGEM

+1

이것은 잠시 전에 물어 본 질문과 같습니다. http://stackoverflow.com/questions/103829/t-sql-how-do-i-get-the-rows-from-one-table-whose-values-completely-match-up-wit –

+0

@HLGEM Order 1의 테스트 목록 (Orders 테이블 참조)이 TestCode 04의 테스트 목록과 정확히 일치하기 때문에 (TestCode 테이블 참조). 이것은 주문 1에 해당하는 유일한 테스트 코드입니다. – Paul

답변

1

이 필요합니다이 각 주문에 대한 테스트 코드를 일치의 수를 계산하고이 숫자가 테스트 코드에 대한 테스트의 수와 순서에 대한 테스트의 번호가 모두 일치 보장

SELECT o.OrderId, t.TestCode 
FROM (
    SELECT o.OrderId, t.TestCode, COUNT(*) AS intCount 
    FROM Orders o 
     INNER JOIN TestCodes t ON t.Test = o.Test 
    GROUP BY o.OrderId, t.TestCode 
) AS ot 
    INNER JOIN (
     SELECT OrderId, COUNT(*) AS intCount 
     FROM Orders 
     GROUP BY OrderId 
    ) AS o ON o.OrderId = ot.OrderId 
    INNER JOIN (
     SELECT TestCode, COUNT(*) AS intCount 
     FROM TestCodes 
     GROUP BY TestCode 
    ) AS t ON ot.TestCode = t.TestCode 
WHERE o.intCount = ot.intCount 
    AND t.intCount = ot.intCount 

.

(TestCode, Test) 쌍은 TestCodes에서 고유하며 Orders에서는 해당 (Order, Test) 쌍이 고유하다는 가정을합니다.

+0

 Order Sample Test 1 1 A 1 2 B 2 1 A 2 2 C 
주문 테이블에 해당 레코드가있는 경우 작동합니까? 이 경우 두 주문의 테스트 횟수는 같지만 테스트 값은 다릅니다. – KFleschner

+0

예,이 경우 작동합니다. 맨 위 쿼리는 두 테이블의 INNER JOIN을 계산합니다. 이것은 그들이 공통으로 가지고있는 테스트의 수를 계산합니다. 주문에 정확히 두 개의 테스트가있는 경우이 테스트 코드 중 하나에 대해 intCount가 2가 될 수 있으므로 다른 테스트 코드는 o.intCount와 일치하지 않습니다. 주문에 3 개 이상의 테스트가있는 경우 잠재적으로 둘 다 일치 할 수 있습니다. 하지만이 경우 o.intCount! = t.intCount가 필터링되므로 필터링됩니다. – Paul

+0

고맙습니다. 이것은 위에서 열거 한 가정을 계속 사용하는 한 잘 작동합니다. 둘 이상의 테스트 코드 세트 (하나의 주문, 두 개의 샘플, 세 개의 테스트가있는 각 샘플)가 포함 된 주문 세트를 가지고있을 때 Orders 테이블 대신 샘플을 계산하는 뷰를 만들었습니다. 이것은 원래의 orders 테이블을 쿼리 가정에 맞게 collaspses. 도움에 다시 한번 감사드립니다. – KFleschner

0

SELECT o.order, t.testcode 는에 testcodes의 t에 가입 o.test = t.test

하지만, 실제로 일이 있다면 당이 하나를 반환합니다이 경우에하는 당신 가지지 마라.

예를 들어, WHERE 절을 추가하여 샘플 당 제한하거나 주문마다 고유 한 세트를 정의하는 다른 방식으로 제한해야합니다. 내가 당신을 믿지

관련 문제