2014-08-29 96 views
0

我有一個表,看起來像這樣有條件加入到基於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

回答

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

一種可能的方式:

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

您可能想要將內連接轉換爲可能工作的左連接 – 2014-08-29 15:23:58

+0

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

0

對於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.

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