SQL Server在第3个表中加入2个具有关系的表

时间:2017-06-09 08:48:03

标签: sql-server

我有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

起初,我错误地忽略了这些字段而不知道答案一直存在。

要发布我的回答。

2 个答案:

答案 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:我真的很抱歉这个解决办法太可怕了。