[英]Left join on the same table
我不記得如何將表連接到自身。我的表是:
| id | proc | value | kind |
| 1 | 1 | foo | a |
| 2 | 1 | bar | b |
| 3 | 2 | some | a |
我需要檢索proc為$ proc而kind為'a'和'b'的col值..好吧,我需要這樣做(尋找proc = 1):
| v_a | v_b |
| foo | bar |
所以我寫了這個查詢:
SELECT
a.value AS v_a,
b.value AS v_b
FROM
(SELECT value FROM table WHERE proc = '1' AND kind = 'a') AS a,
(SELECT value FROM table WHERE proc = '1' AND kind = 'b') AS b
並且有效,但僅在表中我同時具有kind = a和kind = b的兩行的情況下。
但是我需要如果錯過一行,我將有一個空值:如果我尋找proc = 2我必須得到:
| v_a | v_b |
| foo | NULL|
相反,在我的查詢中,如果b或行丟失,我什么也不會得到。
我正在使用mysql ...該怎么做?
編輯:我可以使用UNION子句,但是當缺少一行(kind = a或kind = b)時,這將不允許我使用NULL值
我想念您需要檢索NULL。 這很復雜,但似乎可行:
SELECT
a.value AS a_val,
(SELECT value FROM t b2 WHERE b2.proc = a.proc AND b2.id != a.id) AS b_val
FROM `t` a
WHERE a.kind = 'a'
UNION DISTINCT
SELECT
(SELECT value FROM t a2 WHERE a2.proc = b.proc AND a2.id != b.id) AS a_val,
b.value AS b_val
FROM `t` b
WHERE b.kind = 'b'
如果proc對於'a'而不是'b'存在,則必須進行完全連接:反之亦然:
SELECT
a.value v_a,
b.value v_b
FROM (SELECT proc, value FROM tab WHERE kind = 'a') a LEFT JOIN
(SELECT proc, value FROM tab WHERE kind = 'b') b
ON a.proc = b.proc
WHERE a.proc = '1'
UNION
SELECT
a.value v_a,
b.value v_b
FROM (SELECT proc, value FROM tab WHERE kind = 'b') b LEFT JOIN
(SELECT proc, value FROM tab WHERE kind = 'a') a
ON a.proc = b.proc
WHERE b.proc = '1'
編輯:1st給了MS SQL Server查詢(FULL JOIN),但顯然它不受MYSQL支持,所以我將其更改為2 LEFT JOIN的UNION
select * from t1 full outer join t2 on some_id = some_other_id
?
SELECT
a.value AS v_a,
b.value AS v_b
FROM
(SELECT proc, value FROM table WHERE proc = '1' AND kind = 'a') AS a
LEFT OUTER JOIN
(SELECT proc, value FROM table WHERE proc = '1' AND kind = 'b') AS b
ON a.proc=b.proc
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.