有条件加入到基于2列1个表

问题描述:

我有一个表,看起来像这样有条件加入到基于2列1个表

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。这是否可以在一个选择中完成,因为它正在连接到不同的表格?

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

+0

不,你不能这样的连接。但是,你可以完成使用ISNULL和左连接。没有关于你的表格结构的更多细节,尽管这只是猜测工作。 – 2014-08-29 13:47:10

+0

左连接有什么问题? – Hambone 2014-08-29 13:59:06

我希望工会会帮助你,就像下面给出。

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 

一种可能的方式:

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 

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 
+0

您可能想要将内连接转换为可能工作的左连接 – 2014-08-29 15:23:58

+0

.. – Adi 2014-08-29 15:25:37

对于SourceID = 1,您有两条记录,一条为NULL,另一条为覆盖。哪一个胜利,我会假设#2 ID,但是会有更高的数字应该预测吗?

因为你可能关心的是每个源,它应该是一个最大为简单的(),并没有加入在所有...像

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.

尝试此。您可以修改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