连接3个表以获取其中一个值中没有值的值

时间:2017-07-21 19:13:44

标签: sql sql-server left-join

我有三张桌子,我想加入。问题是 - 我知道3个值中有2个有值,但第三个表中也可能存在某些值。我只想显示不在第三个表格中的值。

tbl1
ClientID    SvcGoalID        VendorID
17          7887             784

tbl2
ClientID    SvcGoalID        SvcAuthID
17          7887             634

tbl3
ClientID    SvcAuthID 
17          634       

所以基本上这是我桌子的粗略结构,这就是我正在寻找的东西。我想在查询中加入所有三个表 - tbl1& tbl2使用SvcGoalID和tb2& tb3使用SvcAuthID - 仅当tbl3中的值为SvcAuthID时才显示数据。非常感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

您声明要从tbl1获取值,而tbl3中没有值。这是您定义的连接结构...

declare @tbl1 table (ClientID int, SvcGoalID int, VendorID int)
insert into @tbl1
values
(17,7887,784)

declare @tbl2 table (ClientID int, SvcGoalID int, SvcAuthID int)
insert into @tbl2
values
(17,7887,634)

declare @tbl3 table (ClientID int, SvcAuthID int)
insert into @tbl3
values
(17,634)


select
    t1.*
    ,t2.*
    ,t3.*
from 
    @tbl1 t1
    inner join
    @tbl2 t2 on t2.SvcGoalID = t1.SvcGoalID
    left join
    @tbl3 t3 on t3.SvcAuthID = t2.SvcAuthID
--where
--  t3.SvcAuthID is null

如果您运行该查询,您将看到它加入并按定义返回。如果取消注释where子句,则不会返回任何行,因为tbl3上存在连接条件。然而。通常这是在有更多行的时候完成的,而且目前非常多余。

只是旁注,你的连接结构基本上使这些都是内连接。为@ tbl3添加不同的值会改变这个..

declare @tbl1 table (ClientID int, SvcGoalID int, VendorID int)
insert into @tbl1
values
(17,7887,784)

declare @tbl2 table (ClientID int, SvcGoalID int, SvcAuthID int)
insert into @tbl2
values
(17,7887,634)

declare @tbl3 table (ClientID int, SvcAuthID int)
insert into @tbl3
values
--(17,634),
(17,555)


select
    t1.*
    ,t2.*
    --,t3.*
from 
    @tbl1 t1
    inner join
    @tbl2 t2 on t2.SvcGoalID = t1.SvcGoalID
    left join
    @tbl3 t3 on t2.SvcAuthID = t3.SvcAuthID
where
    t3.SvcAuthID is null

答案 1 :(得分:0)

我首先LEFT JOIN辅助表(在本例中为tbl1和tbl2)然后我将使用CASE语句。

例如:

SELECT
     3.ClientID
    ,CASE WHEN 3.SvcGoalID ISNULL THEN 2.SvcGoalID ELSE 1.SvcGoalID END
    -- Use above statement for all possible missing columns

FROM tbl1 as 1
LEFT OUTER JOIN tbl3 as 3 ON 3.ClientID = 1.ClientID
LEFT OUTER JOIN tbl3 as 2 ON 2.ClientID = 1.ClientID