如何连接表以获得结果

时间:2010-02-10 13:02:43

标签: sql sql-server

我有以下数据

表1数据:

Attr1    Attr2
36 L
37 L
38 L
39 L
40 L
41 L
42 L
43 L
44 L
46 L
48 L
50 L
52 L
54 L
56 L
58 L
60 L
62 L
36 P
37 P
38 P
39 P
40 P
41 P
42 P
43 P
44 P
46 P
48 P
50 P
52 P
54 P
56 P
58 P
60 P
62 P
36 PL
37 PL
38 PL
39 PL
40 PL
41 PL
42 PL
43 PL
44 PL
46 PL
48 PL
50 PL
52 PL
54 PL
56 PL
58 PL
60 PL
62 PL
36 PS
37 PS
38 PS
39 PS
40 PS
41 PS
42 PS
43 PS
44 PS
46 PS
48 PS
50 PS
52 PS
54 PS
56 PS
58 PS
60 PS
62 PS
36 R
37 R
38 R
39 R
40 R
41 R
42 R
43 R
44 R
46 R
48 R
50 R
52 R
54 R
56 R
58 R
60 R
62 R
36 S
37 S
38 S
39 S
40 S
41 S
42 S
43 S
44 S
46 S
48 S
50 S
52 S
54 S
56 S
58 S
60 S
62 S
36 XL
37 XL
38 XL
39 XL
40 XL
41 XL
42 XL
43 XL
44 XL
46 XL
48 XL
50 XL
52 XL
54 XL
56 XL
58 XL
60 XL
62 XL

和table2如下:

ItemCode          Attr1     Attr2
ITEM-000001 43 S
ITEM-000001 52 L
ITEM-000006 42 R
ITEM-000006 44 R
ITEM-000009 56 R

table2中会有更多项目。

我如何获得输出,其中我将得到具有相同'attr2'的table1的所有行 例如'ITEM-000001'有两个Attr2 - 'S'和amp; 'L'所以它将显示如下:

Attr1    Attr2       ItemCode
    36 L           ITEM-000001
    37 L           ITEM-000001
    38 L           ITEM-000001
    39 L           ITEM-000001
    40 L           ITEM-000001
    41 L           ITEM-000001
    42 L           ITEM-000001
    43 L           ITEM-000001
    44 L
    46 L
    48 L
    50 L
    52 L
    54 L
    56 L
    58 L
    60 L
    62 L           ITEM-000001
    36 S           ITEM-000001
    37 S
    38 S
    39 S
    40 S
    41 S
    42 S
    43 S
    44 S
    46 S
    48 S
    50 S
    52 S
    54 S           ITEM-000001
    56 S           ITEM-000001
    58 S           ITEM-000001
    60 S           ITEM-000001
    62 S           ITEM-000001

4 个答案:

答案 0 :(得分:6)

修改

阅读你的查询,我想我终于知道你想要什么:

ItemCode获取所有DISTINCT Attr2Table2,并加入Attr1中的所有DISTINCT Table1。我仍然无法从您提供的样品中看到...

您可以将查询缩小为:

SELECT DISTINCT T2.ItemCode, T1.Attr1, T2.Attr2
FROM
  Table1 T1
  CROSS JOIN Table2 T2
ORDER BY 1, 2, 3

我想通过以下方式可以提高性能:

SELECT T2.ItemCode, T1.Attr1, T2.Attr2
FROM
  ( SELECT DISTINCT Attr1
    FROM Table1
  ) T1
  CROSS JOIN
  ( SELECT DISTINCT ItemCode, Attr2
    FROM Table2
  ) T2
ORDER BY 1, 2, 3

原帖:

您可以使用LEFT JOIN执行此操作。这将返回Table1的所有行,并连接条件匹配的Table2行。如果没有匹配的行,则Table2的列为NULL

SELECT t1.Attr1, t1.Attr2, t2.ItemCode
FROM Table1 t1
LEFT JOIN Table2 t2 ON ( t2.Attr1 = t1.Attr1 AND t2.Attr2 = t1.Attr2 )
WHERE t1.Attr2 IN ( 'S', 'L' )

答案 1 :(得分:2)

我想我终于理解了你的问题。首先让我用自己的话来描述我认为你想要的东西,看看我是否理解你的要求。

您想要查询特定的商品代码。表1显示了所有可能的(Attr1,Attr2)组合,Table2显示了可用于特定项目代码的组合。您希望返回可用于商品代码的Attr2的行,并且每个(Attr1,Attr2)对显示该商品代码是否可用于此货币对。

我认为此查询可以满足您的需求:

SELECT T1.Attr1, T1.Attr2, T2_2.ItemCode
FROM Table1 T1
JOIN Table2 T2_1
ON T1.Attr2 = T2_1.Attr2
LEFT JOIN Table2 T2_2
ON T1.Attr1 = T2_2.Attr1 AND T1.Attr2 = T2_2.Attr2
WHERE T2_1.ItemCode = 'ITEM-000001'

对于(不完整的)测试数据,结果为:

36, 'L', ''
37, 'L', ''
38, 'L', ''
39, 'L', ''
40, 'L', ''
41, 'L', ''
42, 'L', ''
43, 'L', ''
44, 'L', ''
46, 'L', ''
48, 'L', ''
50, 'L', ''
52, 'L', 'ITEM-000001'
54, 'L', ''
56, 'L', ''
58, 'L', ''
60, 'L', ''
62, 'L', ''
36, 'S', ''
37, 'S', ''
38, 'S', ''
39, 'S', ''
40, 'S', ''
41, 'S', ''
42, 'S', ''
43, 'S', 'ITEM-000001'
44, 'S', ''
46, 'S', ''
48, 'S', ''
50, 'S', ''
52, 'S', ''
54, 'S', ''
56, 'S', ''
58, 'S', ''
60, 'S', ''
62, 'S', ''

我误解了一些事情,请告诉我。

答案 2 :(得分:0)

我认为你所寻找的是从表1中获取具有特定值的ItemCode的所有记录,例如'Item-000001'。如果是这种情况,下面的代码应该做你想要的,只需将'Item-000001'替换为你想要的价值。此外,如果您只查找Attr2为'S'或'L'的记录,那么您将需要where子句的第二部分。

SELECT T1.Attr1, T1.Attr2, T2.ItemCode
FROM Table1 T1
INNER JOIN Table2 T2 ON T1.Attr1 = T2.Attr1 AND T1.Attr2 = T2.Attr2
WHERE T2.ItemCode = 'Item-000001' AND T2.Attr2 IN ('S', 'L')

答案 3 :(得分:0)

大家好,感谢您的所有努力和帮助。我的问题的时间,这里的查询将给我预期的结果。非常感谢大家。

SELECT DISTINCT T2.ItemCode, T1.Attr1, T2.Attr2
FROM  
    (
       SELECT Attr1
       FROM Table1
    ) AS T1

    CROSS JOIN

    ( 
       SELECT ItemCode, Attr2
       FROM Table2
    ) AS T2
ORDER BY 1, 2, 3