我有三张桌子,我想加入。问题是 - 我知道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时才显示数据。非常感谢您的帮助。
答案 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