2010-05-19 70 views
2

好吧,所以我面臨的問題是這樣的,我有一個包含3列的表:ID,鍵和值。SQL:在同一個表中加入不同'where'子句

ID | Key | Value 
================ 
1 | 1 | ab 
1 | 2 | cd 
1 | 3 | ef 
2 | 1 | gh 
2 | 2 | ij 
2 | 3 | kl 

現在我要選擇的鍵1 & 3所有ID值,回報應該是這樣的

ID | 1 | 2 
================ 
1 | ab | ef 
2 | gh | kl 

所以每包含鍵1 & 3的值ID 1列。

我嘗試使用「加入」,但因爲我需要使用多個where子句我無法弄清楚如何得到這個工作..

+0

爲什麼ID不是唯一的?這是一個關係表嗎? – mga 2010-05-19 15:43:16

+0

該ID是不同表格的外鍵 – Pmarcoen 2010-05-19 15:44:10

+0

您可能需要的內容通常稱爲數據透視表。但是實現取決於你正在使用的數據庫服務器(因爲答案通常是程序化的,而不僅僅是一個選擇)。 – 2010-05-19 15:44:22

回答

4

對於Oracle 8i中+,用途:

SELECT t.id, 
     MAX(CASE WHEN t.key = 1 THEN t.value ELSE NULL END) AS "1", 
     MAX(CASE WHEN t.key = 2 THEN t.value ELSE NULL END) AS "2" 
    FROM TABLE t 
GROUP BY t.id 

對於之前的Oracle版本,交換CASE出來DECODE syntax。 Oracle直到11g才添加PIVOT語法。

+0

@Vincent Malgrat:Thx,不知道CASE是早期支持的。 – 2010-05-19 15:57:48

+0

嗯保持收到一個錯誤'缺少左括號'使用此代碼。雖然似乎沒有任何東西丟失.. – Pmarcoen 2010-05-19 16:02:34

+0

@Pmarcoen:檢查聚合函數 - 確保CASE語句完全位於其中。 – 2010-05-19 16:04:19

0

爲什麼不能你只是做三個查詢?

如果我正確理解你,你將不得不使用聯合加入。

0
SELECT ID, VALUE AS v1, S.v2 
FROM TABLE 
WHERE KEY = 1 
JOIN (SELECT ID, VALUE AS v2 FROM TABLE WHERE Key =3) AS S ON TABLE.ID = S.ID 

如果您需要更多,添加一個連接每個地方...

1

不使用樞查詢,你也可以使用子查詢加盟,如下:

SELECT  t.id, MAX(key_1.value) AS '1', MAX(key_3.value) AS '2' 
FROM  tb t 
INNER JOIN (SELECT id, value FROM tb WHERE `key` = 1) key_1 ON (key_1.id = t.id) 
INNER JOIN (SELECT id, value FROM tb WHERE `key` = 3) key_3 ON (key_3.id = t.id) 
GROUP BY t.id; 

測試用例(在MySQL):

CREATE TABLE tb (`id` int, `key` int, `value` char(2)); 
INSERT INTO tb VALUES (1, 1, 'ab'); 
INSERT INTO tb VALUES (1, 2, 'cd'); 
INSERT INTO tb VALUES (1, 3, 'ef'); 
INSERT INTO tb VALUES (2, 1, 'gh'); 
INSERT INTO tb VALUES (2, 2, 'ij'); 
INSERT INTO tb VALUES (2, 3, 'kl'); 

結果:

+------+------+------+ 
| id | 1 | 2 | 
+------+------+------+ 
| 1 | ab | ef | 
| 2 | gh | kl | 
+------+------+------+ 
2 rows in set (0.04 sec) 
+0

做了伎倆,thx隊友! – Pmarcoen 2010-05-19 16:12:19