我有以下数据
表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
答案 0 :(得分:6)
修改强>
阅读你的查询,我想我终于知道你想要什么:
从ItemCode
获取所有DISTINCT Attr2
和Table2
,并加入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