2014-12-04 71 views
1

我有3個表名爲A,B和C.表A有列a。表B列a,b。表C列a,c。這些表中包含類似下面的數據:SQL JOIN或UNION還是什麼?

enter image description here

我想從A,B,C中的所有數據,其中a = 1

我的期望輸出應該如下:

enter image description here

但我從SSMS得到的結果如下:

enter image description here

我應該如何重構我的SQL來獲得我想要的輸出?

例如我不想在列中重複的值

+1

*「我不想在列中重複值」*您想要一個非常不尋常的東西,我認爲在SQL中創建所需的輸出是困難的和不可能的。你能解釋一下你正在操作的數據,它是如何關聯的,以及爲什麼這個特定的輸出格式必須是SQL查詢的結果? – Tomalak 2014-12-04 11:32:23

+0

@Tomalak請看看我接受的** @ Gordon Linoff **的回答。可能是那**難**。但**不可能**? – autopilot 2014-12-06 03:21:17

+0

「不可能」取決於所使用的數據庫服務器。你沒有回答我的問題。我真的很想知道這是什麼。對我來說,這看起來像一個數據庫設計錯誤和一般濫用關係數據庫範例。 – Tomalak 2014-12-06 05:17:11

回答

2

您需要加入這些值,但不僅在a值上,而且在該位置上。 SQL表格表示無序集合。我將假定bc列表示排序。

select a.a, b.b, c.c 
from (select a.*, row_number() over (order by a) as seqnum 
     from a 
    ) a full outer join 
    (select b.*, row_number() over (partition by a order by b) as seqnum 
     from b 
    ) b 
    on a.a = b.a and a.seqnum = b.seqnum full outer join 
    (select c.*, row_number() over (partition by a order by c) as seqnum 
     from c 
    ) c 
    on c.a = coalesce(a.a, b.a) and c.seqnum = coalesce(a.seqnum, b.seqnum) 
where coalesce(a.a, b.a, c.a) = 1; 
+0

問候大師@Gordon Linoff!確切地說,我一直在尋找.... – autopilot 2014-12-06 03:18:49

+0

你可以請你解釋一下關於你的查詢! **如果我沒有在b和c列中訂購,該怎麼辦?** – autopilot 2014-12-06 03:50:46

+0

@autopilot。 。 。我不確定需要解釋什麼。子查詢會爲每個表的「a」值添加一個連續編號。然後使用這個連續的數字作爲「完全外部連接」的條件的一部分,該連接保留了兩個表中的所有行,即使沒有匹配時也是如此。 – 2014-12-06 03:55:25