【发布时间】:2019-11-04 12:56:49
【问题描述】:
我有一个 Table1:
IdT1,IdT1Group
11、30
12、30
13、30
表2:
IdT2、IdT1、详细信息
2、11、A
3、11、B
4、12、A
5、12、B
我希望我的查询是:
IdT2、IdT1、详细信息
2、11、A
3、11、B
2、12、A
3、12、B
NULL , 13 , A
NULL , 13 , Bp>
所以,我使用交叉连接:
SELECT table2.IdT2,
table1.IdT1, table2.Detail
FROM table2 CROSS JOIN table1
WHERE table2.IdT1 = 11 AND table1.IdT1Group = 30
但是在我尝试了我的代码之后,它是:
IdT2 IdT1 Detail
2 , 11 , A
3 , 11 , B
2 , 12 , A
3 , 12 , B
2 , 13 , A
3 , 13 , B
应该是这样的:
IdT2, IdT1, Detail
2 , 11 , A
3 , 11 , B
2 , 12 , A
3 , 12 , B
NULL , 13 , A
NULL , 13 , B
如果我使用这个查询:
SELECT T2.IdT2, tblJoin.IdT1, tblJoin.Detail
FROM Table2 AS T2 RIGHT JOIN
(SELECT Table2.IdT2,
Table1.IdT1, Table2.Detail
FROM Table2 CROSS JOIN Table1 WHERE Table2.IdT1 = 11 AND Table1.IdT1Group = 30
) AS tblJoin ON T2.IdT1 = tblJoin.IdT1 And T2.IdT2 = tblJoin.IdT2 ORDER BY IdT2
结果是:
IdT2,IdT1,详细信息
NULL , 12 , A
NULL , 12 , Bp>
NULL , 13 , A
NULL , 13 , Bp>
2、11、A
3、11、B
如果表 2 上的数据是:
IdT2、IdT1、详细信息
2、11、A
3、11、B
4、11、C
5、12、A
6、12、B
,我期望的选择数据是:
IdT2 ; IdT1 ;详情
2、11、A
3、11、B
4、11、C
2、12、A
3、12、B
NULL , 12 , C
NULL , 13 , A
NULL , 13 , Bp>
NULL , 13 , C
【问题讨论】:
-
怎么知道idt1 = 13有两个细节A和B?
-
实际上我是选择 IdT1 = 11 的行作为交叉连接的键,所以如果在 IdT1 (11) 上在表 2 上有 3 个详细信息,我期望的选择数据将是: IdT2 : 2,3,4, 2,3,4 Null,Null,Null ; IdT1 : 11,11,11,12,12,12,13,13,13 详细信息 : A,B,C, A,B,C, A,B,C
-
请使用更多示例数据编辑您的帖子,而不是在评论中添加信息。
-
你不可能得到你所说的结果。
WHERE table2.IdT2 = 2的 WHERE 子句将阻止结果中包含idT2=3 的行。 -
哦,是的,我错了,它是:WHERE table2.IdT1 = 11(我想交叉加入 Table1.11 对所有其他 11 组(30)的详细信息)
标签: sql-server select left-join cross-join right-join