有条件加入到基于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。这是否可以在一个选择中完成,因为它正在连接到不同的表格?
我想在不引入一堆左连接的情况下做到这一点,如果可能的话。
我希望工会会帮助你,就像下面给出。
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
您可能想要将内连接转换为可能工作的左连接 – 2014-08-29 15:23:58
.. – 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
不,你不能这样的连接。但是,你可以完成使用ISNULL和左连接。没有关于你的表格结构的更多细节,尽管这只是猜测工作。 – 2014-08-29 13:47:10
左连接有什么问题? – Hambone 2014-08-29 13:59:06