2017-11-25 162 views
3

我有以下表和數據:SQL查詢在同一個表JOIN給定數據

CREATE TABLE TEST_TABLE (
    ID NUMBER(6) NOT NULL, 
    COMMON_SEQ NUMBER(22), 
    NAME VARCHAR(20), 
    CONSTRAINT PK_CONST PRIMARY KEY (ID) 
); 
INSERT INTO TEST_TABLE (ID, COMMON_SEQ, NAME) VALUES (1001, NULL, 'Michelle'); 
INSERT INTO TEST_TABLE (ID, COMMON_SEQ, NAME) VALUES (1002, NULL, 'Tiberius'); 
INSERT INTO TEST_TABLE (ID, COMMON_SEQ, NAME) VALUES (1003, NULL, 'Marigold'); 
INSERT INTO TEST_TABLE (ID, COMMON_SEQ, NAME) VALUES (1004, 999, 'Richmond'); 
INSERT INTO TEST_TABLE (ID, COMMON_SEQ, NAME) VALUES (1005, 999, 'Marianne'); 
INSERT INTO TEST_TABLE (ID, COMMON_SEQ, NAME) VALUES (1006, NULL, 'Valentin'); 
INSERT INTO TEST_TABLE (ID, COMMON_SEQ, NAME) VALUES (1007, 888, 'Juliette'); 
INSERT INTO TEST_TABLE (ID, COMMON_SEQ, NAME) VALUES (1008, NULL, 'Lawrence'); 

在此表中的一些記錄被COMMON_SEQ的共同價值(與對方的例子COMMON_SEQ 999涉及里士滿和瑪麗安)。

如何根據給定ID作爲輸入選擇所有名稱?

我試着將表加入自己(當COMMON_SEQ爲空時工作正常)。此示例返回米歇爾記錄:

SELECT T.ID, T.COMMON_SEQ,T.NAME 
FROM TEST_TABLE T 
LEFT JOIN TEST_TABLE T2 ON NOT T.COMMON_SEQ is NULL 
    AND T.COMMON_SEQ=T2.COMMON_SEQ AND T.ID<>T2.ID 
WHERE T.ID=1001 

不過,這並不帶回2個記錄ID 1004這個例子只返回里士滿記錄(但我還需要返回瑪麗安記錄):

SELECT T.ID, T.COMMON_SEQ,T.NAME 
FROM TEST_TABLE T 
LEFT JOIN TEST_TABLE T2 ON NOT T.COMMON_SEQ is NULL 
    AND T.COMMON_SEQ=T2.COMMON_SEQ AND T.ID<>T2.ID 
WHERE T.ID=1004 

當我只提供一個ID值(1004或1005)時,如何改進/重寫查詢以返回Richmond和Marianne記錄?

+0

因爲NULL = NULL是不正確的。 (你可以使用'x不是從y'離開,如果可用的話) – wildplasser

+0

你使用哪個數據庫?甲骨文? – Ramesh

+0

@Ramesh我使用2個數據庫:H2和Oracle。我需要適用於這兩者的通用SQL。 – user1697575

回答

4

你可以使用:

SELECT * 
FROM TEST_TABLE t 
WHERE COMMON_SEQ IN (SELECT COMMON_SEQ 
        FROM TEST_TABLE t1 
        WHERE t1.ID = 1004) 
    OR t.ID = 1004;     

DBFiddle Demo

傳遞相同的參數兩次COMMON_SEQ處理NULL

+1

謝謝!我只是試過了,它會爲我的所有測試用例返回預期的結果! – user1697575

+0

@ user1697575很高興聽到它。 – lad2025

2

試試這個

SELECT COALESCE (ty.id, tx.id) AS id, 
     COALESCE (ty.common_seq, tx.common_seq) AS common_seq, 
     COALESCE (ty.name, tx.name) AS name 
    FROM test_table tx LEFT OUTER JOIN test_table ty 
      ON (tx.common_seq = ty.common_seq) 
WHERE tx.ID = 1004; 

有了這個,你能避免使用IN或EXISTS,這很可能是更好的性能。

+0

謝謝!有用。 – user1697575

+0

@ user1697575 - 很高興幫助 – Ramesh

+0

只是好奇你爲什麼使用COALESCE函數?我不能只使用SELECT ty。* FROM ...? – user1697575