【问题标题】:join 3 tables to get values where there isn't a value in one of the values连接 3 个表以获取其中一个值中没有值的值
【发布时间】:2017-07-22 04:12:33
【问题描述】:

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

tbl1
ClientID    SvcGoalID        VendorID
17          7887             784

tbl2
ClientID    SvcGoalID        SvcAuthID
17          7887             634

tbl3
ClientID    SvcAuthID 
17          634       

所以基本上这是我的表格的粗略结构,这就是我要寻找的。我希望在查询中加入所有三个表 - 使用 SvcGoalID 的 tbl1 和 tbl2 以及使用 SvcAuthID 的 tb2 和 tb3 - 并且仅在使用 SvcAuthID 的 tbl3 中没有值时显示数据。任何帮助将不胜感激。

【问题讨论】:

  • left join tbl3 on tbl2.SvcAuthID = tbl3.SvcAuthID where tbl3.SvcAuthID is null
  • 当你说 tbl3 中没有值时,你的意思是没有匹配的行来加入吗? (即在您的示例中,如果 tbl3.SvcAuthID = 633,那么您现在需要返回数据)
  • @scsimon - 不能使用 ClientID - 必须是 tbl1 和 tbl2 之间的 SvcGoalID - 这些是唯一的唯一值 - 对于同一个客户端,我可以在 tb1 和 tbl2 之间有 20-30 条记录,相同去tbl3。我只能使用 svcGoalID 和 svcAuthID
  • 错字@yanman1234 但我修正了...只是一个非常奇怪的数据结构
  • @BobSki 如果这不起作用,我们可以以类似的方式使用子查询

标签: sql sql-server left-join


【解决方案1】:

您说要从 tbl1 和 2 中获取值,而 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

【讨论】:

    【解决方案2】:

    我将首先 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多