我有一张看起来像这样的表
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中。这可以在一个选择中进行,因为它连接到不同的表吗?
如果可能的话,我试图在不引入一堆左连接的情况下这样做。
答案 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.