2009-12-15 41 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 

表:訂單

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

我無法找到一個方法來返回

 
Order TestCode 
1  04 
2  02c 

我試過TSQL的看法,但可以」 t找到一種方法將一個表中的一組值與另一個表中的一組值相比較。

+0

問題是定義你需要什麼標準來獲得這些結果。爲什麼會記錄一個返回04和記錄2返回02C? – HLGEM 2009-12-15 22:25:49

+1

這看起來像是我之前問過的一個問題。 http://stackoverflow.com/questions/103829/t-sql-how-do-i-get-the-rows-from-one-table-whose-values-completely-match-up-wit – 2009-12-15 22:31:22

+0

@HLGEM它是因爲Order 1中的測試列表(請參閱Orders表)與TestCode 04中的測試列表完全匹配(請參閱TestCode Table)。這是唯一的測試代碼,這對於訂單1來說是正確的。 – Paul 2009-12-15 22:55:19

回答

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中是唯一的,並且(Order,Test)對在Orders中是唯一的。

+0

 Order Sample Test 1 1 A 1 2 B 2 1 A 2 2 C 
如果在訂單表中記錄這樣的記錄,那麼這是否可行? 在這種情況下,這兩個訂單都有相同的測試計數,但測試值不同。 – KFleschner 2009-12-16 15:29:26

+0

是的,它會在這種情況下工作。頂部查詢確實計算了兩個表的INNER JOIN。這統計了他們共同的測試數量。如果訂單有兩個測試,那麼對於其中一個測試代碼,它只能得到2的intCount,所以另一個不會與o.intCount匹配。如果一個訂單有超過3個測試,那麼它可能會匹配他們兩個。但在這種情況下,o.intCount!= t.intCount,所以也會被過濾。 – Paul 2009-12-16 16:37:42

+0

非常感謝。只要我仍在使用上面列出的假設,就可以很好地工作。當我的訂單集包含多個測試代碼集(一個訂單,兩個樣本,每個樣本有三個測試)時,我將放置一個視圖來計數樣本來代替訂單表。這匹配了原始訂單表以適合查詢的假設。再次感謝您的幫助。 – KFleschner 2009-12-16 19:50:46

0

SELECT o.order,t.testcode 從訂單Ø 加入testcodes T ON o.test = t.test

它只會返回一個每竟彷彿有一個,不過,在這種情況下,你沒有。

因此,您必須添加一個WHERE子句來限制樣例或限制其他一些定義每個訂單的唯一集合的方式。

相關問題