基于1个表中的2列有条件地连接到两个不同的表

时间:2014-08-29 13:45:08

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

我有一张看起来像这样的表

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

我需要想办法说出OverrideQueueID是否为NULL然后只是从dbo.Box到dbo.Source.ID的连接,否则如果OverrideQueueID IS NOT NULL则加入到dbo.Queue.ID中。这可以在一个选择中进行,因为它连接到不同的表吗?

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

5 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

一种可能的方式:

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

答案 2 :(得分:1)

试试这个。您可以修改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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

SourceID = 1有两条记录。一条记录为NULL,另一条记录为覆盖。哪一个获胜,我会假设#2 ID,但可能会有一个更高的数字,应该采取预防措施?

既然你可能关注每个源码,它应该像max()一样简单,而且根本没有连接......就像

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

应用的coalesce将基本上采用任何覆盖队列,只需用自己的源替换它们。因此,对于记录1和3将指向自己作为要应用的队列1和3。仅在sourceID = 1,其中有两条记录,#2队列将取代#1(空覆盖)队列。

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.