我有3张桌子:
Table_A
tblA_ID | tblA_Key | tblA_Info
1 2A ABC
Table_B
tblB_ID | tblB_to_A_Relations | tblB_Info
1 1 XYZ
2 1 DEF
3 1 QWE
4 1 NOP
Table_C
tblC_ID | tblC_to_A_Relations | tblC_Info
1 2A 999
2 2A 888
3 2A 777
Table_B和Table_C没有直接关系,但我想通过使用它们在Table_A上的关系来加入它们。这是我到目前为止所尝试过的。
SELECT DISTINCT
b.*,
c.tblC_Info,
FROM Table_B b
LEFT JOIN (SELECT tblA_ID, tblA_Key FROM Table_A
WHERE tblA_Key = @parameter)a
ON a.tblA_ID = b.tblB_to_A_Relations
LEFT JOIN Table_C c
ON c.tblC_to_A_Relations = a.tblA_Key
ORDER BY b.tblB_ID ASC
以某种方式输出:
ResultSet
tblB_ID | tblB_to_A_Relations | tblB_Info | tblC_Info
1 1 XYZ 999
1 1 XYZ 888
1 1 XYZ 777
2 1 DEF 999
2 1 DEF 888
2 1 DEF 777
3 1 QWE 999
3 1 QWE 888
3 1 QWE 777
4 1 NOP 999
4 1 NOP 999
4 1 NOP 999
但我的预期输出是这样的:
ExpectedOutput
tblB_ID | tblB_to_A_Relations | tblB_Info | tblC_Info
1 1 XYZ NULL
2 1 DEF 999
3 1 QWE 888
4 1 NOP 777
肯定遗漏了什么。真的很感激任何帮助!
修改
在对现有表格和数据进行更多检查之后,上面的结果似乎已经过滤了记录,幸运的是,在经过繁琐的追踪之后,我发现了一个以某种方式告诉他们它们与其他记录不同的字段。
Table_B
tblB_ID | tblB_to_A_Relations | tblB_Info | **tblB_Values**
1 1 XYZ AAA
2 1 DEF BBB
3 1 QWE CCC
4 1 NOP DDD
Table_C
tblC_ID | tblC_to_A_Relations | tblC_Info | **tblC_Values**
1 2A 999 BBB
2 2A 888 CCC
3 2A 777 DDD
起初,我错误地忽略了这些字段而不知道答案一直存在。
要发布我的回答。
答案 0 :(得分:0)
Declare @A table
(
tbla_ID int,
tblA_Key varchar(2),
tbla_info varchar(3)
)
Declare @B table
(
tblb_ID int,
tblB_to_A varchar(2),
tblB_info varchar(3)
)
Declare @C table
(
tblb_ID int,
tblC_to_A varchar(2),
tblB_info int
)
Insert into @A
Select 1,'2A','ABC'
Insert into @B
Select 1,1,'XYZ'
union
Select 2,1,'DEF'
union
Select 3,1,'QWE'
union
Select 4,1,'NOP'
Insert into @c
Select 1,'2A',999
UNION
Select 2,'2A',888
UNION
Select 3,'2A',777
Select B.*,C.tblB_info from @A A
join @B B
on A.tbla_ID=B.tblB_to_A
left join @C C
on B.tblb_ID=C.tblb_ID and A.tbla_key=C.tblC_to_A
空值属于第4行,完全等于' NOP'
答案 1 :(得分:0)
我做的解决方法:
创建一个临时容器,并在参考Table_A的临时表的修改列中将Table_B中的唯一键更新为Table_C。
这是临时表的样子:
TempTbl
tblC_ID | Modified_Col | tblC_to_A_Relations | tblC_Info
1 2 2A 999
2 3 2A 888
3 4 2A 777
使用Table_C(#TempTbl)
的副本进行管理以获取此结果集UPDATE #TempTbl
SET
#TempTbl.Modified_Col = #TempTbl_B.tblB_ID
FROM
#TempTbl
INNER JOIN
#TempTbl_B
ON
#TempTbl.tblB_Values = #TempTbl_B.tblC_Values
拉开左边的连接以获得最终结果。
SELECT * FROM Table_B x
LEFT JOIN #TempTbl y
ON x.tblB_ID = y.Modified_Col
PS:我真的很抱歉这个解决办法太可怕了。