簡體   English   中英

左聯接在同一張桌子上

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM