2013-02-18 57 views
-1

假設下面的示例表:SQL JOIN表與子表的

+-----+-----+-----+ 
| ID1 | ID2 | VAL | 
+-----+-----+-----+ 
| A | X | 1 | 
| A | Y | 2 | 
| A | Z | 3 | 
| B | X | 4 | 
| B | Z | 5 | 
| C | Y | 6 | 
+-----+-----+-----+ 

說我很感興趣,ID1 = B並希望它和別人比較。期望的輸出將是:

+---------+---------+---------+---------+---------+---------+---------+ 
| REF.ID1 | OTH.ID1 | REF.ID2 | REF.ID2 | REF.VAL | OTH.VAL | DIFF | 
+---------+---------+---------+---------+---------+---------+---------+ 
| B  | A  | X  | X  | 4  | 1  | 3  | 
| B  | A  | NULL | Y  | NULL | 2  | -2  | 
| B  | A  | Z  | Z  | 5  | 3  | 2  | 
| B  | B  | X  | X  | 4  | 4  | 0  | 
| B  | B  | Z  | Z  | 5  | 5  | 0  | 
| B  | C  | NULL | Y  | NULL | 6  | -6  | 
+---------+---------+---------+---------+---------+---------+---------+ 

謝謝。

+1

是什麼問題? – 2013-02-18 14:23:00

+0

我的問題是如何獲得所需的輸出。什麼可能不清楚? – 2013-02-18 14:27:41

回答

2

你需要的是一個交叉聯接:

SELECT Ref.Id, Oth.id, ...... 
FROM dbo.tbl AS Ref 
CROSS JOIN dbo.tbl AS Oth 
WHERE Ref.Id = 'B'; 

欲瞭解更多關於加入這裏看看我的博客系列:http://sqlity.net/en/1146/a-join-a-day-introduction/

交叉聯接這裏描述:http://sqlity.net/en/1183/a-join-a-day-the-cross-join/

+0

不知何故,我不能用'交叉連接'來提出工作解決方案。您可以使用[this](http://sqlfiddle.com/#!3/43b53/5)找到答案嗎? – 2013-02-19 08:16:25

1

這應該做:

SELECT A.ID1 [REF.ID1], 
     A.ID1 [OTH.ID1], 
     CASE WHEN A.ID2 = B.ID2 THEN A.ID2 ELSE NULL END [REF.ID2], 
     B.ID2 [OTH.ID2], 
     CASE WHEN A.ID2 = B.ID2 THEN A.VAL ELSE NULL END [REF.VAL], 
     B.VAL [OTH.VAL], 
     CASE WHEN A.ID2 = B.ID2 THEN A.VAL ELSE 0 END - B.VAL [DIFF] 
FROM ( SELECT * 
     FROM YourTable 
     WHERE ID1 = 'B') A 
CROSS JOIN YourTable B 
+0

對不起,但它沒有。見[這裏](http://sqlfiddle.com/#!3/43b53/2)。 – 2013-02-19 08:13:28

+1

@ danas.zuokas好吧,我看到結果與您發佈的結果不完全匹配。但是,你想要的reuslt有一些不一致的地方,例如,我們應該如何知道'ID1 ='B''需要與其他5行進行比較?',沒有明確的方法來做你想要的連接 – Lamak 2013-02-19 13:08:29