2011-07-14 136 views
4

返回行我需要從一個表,其中的ID可能不存在得到ID列表和相應的領域。例如,表如下所示:當許多條件之一不滿足

id | status 
------------- 
1234 | A 
4567 | B 
1020 | C 

我想從行狀態與id=4567id=7777,像這樣:

Result: 
id | status 
------------- 
4567 | B 
7777 | 

由於沒有使用id = 7777它應該顯示沒有記錄一個空的狀態字段。

我迄今爲止:我可以得到一個空行,當有與DUAL加入結果對於任何ID匹配的任何記錄。例如:

SELECT id, status FROM DUAL LEFT OUTER JOIN mytable ON id='7777' 

給出一個空行的結果:

id | status 
------------- 
    | 

但是,增加的有效ID的狀態只返回一個行:

SELECT id, status FROM mytable WHERE (id='7777' OR id='4567') 

id | status 
------------- 
4567 | B 

我怎樣才能使查詢返回一個包含所請求的ID的行,即使它沒有記錄?

+0

我無法理解你的桌子......什麼是DUAL? –

+0

@Adam:http://en.wikipedia.org/wiki/DUAL_table – Quassnoi

+0

@Adam:DUAL是Oracle在不想使用表格時使用的虛擬表格。例如SELECT 1 FROM DUAL。 – CristiC

回答

2
SELECT q.id, m.status 
FROM (
     SELECT 4567 AS id 
     FROM dual 
     UNION ALL 
     SELECT 7777 AS id 
     FROM dual 
     ) q 
LEFT JOIN 
     mytable m 
ON  m.id = q.id 
+0

這工作得很好。它爲每個id放入一行NULL,但沒有結果。但是,我需要一行NULL來包含沒有匹配的id。這可能嗎? – hughes

+0

@hughes:哦,對不起。現在試試。 – Quassnoi

+0

完美!非常感謝!這對我來說很有意義。 – hughes

0

即使在其他連接表中沒有對應記錄的情況下,讓外連接返回表(左邊)的值。 (右外連接是相同的,只是它從右表中返回數據,即使左表中沒有相應的記錄)

含義您需要在至少一個表中有數據才能獲取它在結果中。

其實這就是爲什麼你的數據4567的原因。您在左表中有一條對應於4567的記錄(而不是在dual)。

您不必在任一表的7777,這就是爲什麼它不結果來。

這裏有兩個選項 其中之一,正如@Quassnoi所說的,您可以從雙選中選擇所有記錄,並與其他表左連接。
如果您的數據是動態數據或者您擁有大量數據,則這可能不實用。 在這種情況下,您可以使用您的數據創建一個小型臨時表,然後與其他表一起加入。長話短說:您需要將數據放在某個地方,以便與其他表格一起使用。

+0

是否可以在'select'查詢中創建一個臨時表?我只有閱讀權限。 – hughes

+0

@hughes您的數據從哪裏來? – Nivas

0

使用RIGHT OUTER JOIN,而不是LEFT OUTER JOIN

+0

不知道這是什麼結果,但查詢超時,當我嘗試它。這是一張大約一百萬行的大桌子。 – hughes

0

用臨時表,在那裏你存儲4567和7777,或適當的查詢,你可以做一個聯盟:

SELECT DISTINCT n, '' 
    FROM tmp, tbl 
    WHERE n NOT IN (SELECT id FROM tbl) 
UNION (
SELECT id, status 
    FROM tmp, tbl 
    WHERE n=id); 

我測試了PostgreSQL的 - 它可能來自於甲骨文的語法不同。

+0

如果我擁有隻讀權限,是否可以創建臨時表? – hughes

+0

我沒有看到只讀訪問提示。這是一個新的信息?由於我沒有安裝oracle,所以我不知道。我猜不會。你沒有從查詢中獲得ID嗎? Postgresql有一些僞表來生成數組,但我並不堅定,但是當然,如​​果oracle有類似的東西,語法將會非常不同。但是DUAL不是候選人嗎? –