TSQL:检索一个值,其中一个表中的一组值与另一个表中的一组值匹配

时间:2009-12-15 22:22:18

标签: 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视图,但无法找到将一个表中的一组值与另一个表中的一组值进行比较的方法。

2 个答案:

答案 0 :(得分: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中是唯一的。

答案 1 :(得分:0)

SELECT o.order,t.testcode 从订单o 在o.test = t.test

上加入测试代码

如果实际上只有一个,它将只返回一个,但在这种情况下你没有。

因此,您必须添加一个WHERE子句,例如,以某种其他方式限制Samples或限制,以定义每个订单的唯一集合。