2009-12-15 69 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子句来限制样例或限制其他一些定义每个订单的唯一集合的方式。

相关问题