【问题标题】:Conditional join to two different tables based on 2 columns in 1 table基于 1 个表中的 2 列条件连接到两个不同的表
【发布时间】:2014-10-23 13:05:00
【问题描述】:

我有一张像这样的表

dbo.Box
ID SourceID    OverrideQueueID
1      1              NULL
2      1              2
3      2              NULL

我需要找出一种方法来判断 OverrideQueueID 是否为 NULL,然后只需从 dbo.Box 连接到 dbo.Source.ID,否则如果 OverrideQueueID 不是 NULL,则改为连接到 dbo.Queue.ID。由于它正在加入不同的表,因此可以在一次选择中执行此操作吗?

如果可能的话,我试图在不引入一堆左连接的情况下做到这一点。

【问题讨论】:

  • 不,你不能这样做。但是,您可能可以使用 ISNULL 和左连接来完成。尽管这只是猜测工作,但没有有关您的表结构的更多详细信息。
  • 左连接有什么问题?

标签: sql sql-server sql-server-2008 tsql sql-server-2012


【解决方案1】:

我希望工会能帮助你,如下所示。

Select Col1,Col2
From  dbo.Box B
Join dbo.Source S On S.Id = b.SourceID
Where B.OverrideQueueID  is Null
Union
Select Col1,Col2
From  dbo.Box B
Join  dbo.Queue Q On Q.Id = b.SourceID
Where B.OverrideQueueID  is Not Null

【讨论】:

    【解决方案2】:

    一种可能的方式:

    select * from Box as a
    join Box as b ON a.OverrideQueueID is null and a.ID = b.SourceID
    join Queue as q ON a.OverrideQueueID is not null and a.ID = q.ID
    

    【讨论】:

      【解决方案3】:

      试试这个。您可以修改 WHERE 子句以满足您的需要。

      SELECT 
          b.*,
          s.*,
          q.*
      FROM
          dbo.Box b
          LEFT JOIN dbo.[Source] s ON s.ID = b.SourceID AND b.OverrideQueueID IS NULL
          LEFT JOIN dbo.[Queue] q ON q.ID = b.OverrideQueueID AND b.OverrideQueueID IS NOT NULL
      WHERE
          s.ID IS NOT NULL OR q.ID IS NOT NULL
      

      【讨论】:

        【解决方案4】:
        select *,a. form box b 
        inner join (select OverrideQueueID ,SourceID
        from box where OverrideQueueID  is null)a 
        on b.id=a.SourceID
        
        inner join  dbo.Queue.ID a
        where b.OverrideQueqeID  is not null
        on B.ID = Q.ID
        

        【讨论】:

        • 您可能希望将内连接转换为左连接
        【解决方案5】:

        SourceID = 1 有两条记录。一条为 NULL,另一条为覆盖。哪一个赢了,我会假设 #2 ID,但是否有更高的数字应该优先考虑?

        由于您可能关心每个源,它应该像 max() 一样简单,并且根本没有连接......类似

        select 
              b.SourceID,
              max( coalesce( b.OverrideQueueID, b.ID )) as FinalQueue
           from
              Box b
           group by
              b.SourceID
        

        所应用的合并基本上会采用任何覆盖队列,并将它们替换为自己的源。因此,对于记录 1 和 3 将指向自己作为要应用的队列 1 和 3。只有在有两条记录的 sourceID = 1 时,#2 队列才会取代 #1(NULL 覆盖)队列。

        dbo.Box
        ID SourceID    OverrideQueueID   Coalesce value
        1      1              NULL       1
        2      1              2          2
        3      2              NULL       3
        

        因此,sourceID = 1 的最大值将是队列 2,而 SourceID = 2 的最大值将是队列 3。

        【讨论】:

          猜你喜欢
          • 2013-10-20
          • 1970-01-01
          • 1970-01-01
          • 2021-10-26
          • 1970-01-01
          • 2019-05-30
          • 2011-08-06
          • 2013-09-29
          • 2012-10-11
          相关资源
          最近更新 更多