2009-09-28 52 views
2

基本上,我想要的是,如果在'X'類型的tableB中有一條記錄,我希望看到它,否則我不需要,但我希望tableA中的所有記錄。如何從tableA中獲取tableB中左外連接和whereB條件的所有記錄?

我知道我可以通過將tableB.type ='X'放在LEFT OUTER JOIN ON子句中來實現這一點,但是我不能這樣做,因爲我僅限於使用where條件,因爲我是使用一個程序的受限查詢管理器我不會命名,但我絕對討厭。 :)

SELECT * 
FROM tableA 
LEFT OUTER JOIN ON tableA.ID = tableB.ID 
WHERE tableB.type = 'X' 

我該如何做到這一點?

編輯

我試過,但我仍然沒有從表A獲得的所有記錄。我正在SQL服務器上測試這一點,以避免等待很長時間才能使我的查詢在生產系統上運行。如果有幫助,我很確定生產系統正在使用Oracle。

SELECT * 
FROM tableA LEFT OUTER JOIN ON tableA.ID = tableB.ID 
WHERE tableB.type = 'X' OR tableB.type IS NULL 

回答

3

TableB中檢查null S:

SELECT * 
FROM tableA LEFT OUTER JOIN ON tableA.ID = tableB.ID 
WHERE tableB.type = 'X' 
OR tableB.type IS NULL 

,將讓你一切從兩個表時加入比賽,一切從表A時,有TableB中沒有相應的記錄。

如果type可以null自然,你要的條件更改爲更具聲音:

SELECT * 
FROM tableA LEFT OUTER JOIN ON tableA.ID = tableB.ID 
WHERE tableB.type = 'X' 
OR tableB.ID IS NULL 

假設ID是主鍵,不能null自然會得到同樣的結果。

+0

+1用於說明類型可能是一個NULL值 – RedFilter 2009-09-28 16:53:29

+0

在這些情況下的情況下,我總是試圖比較主鍵「 IS NULL「 - 這是此答案中的第二個SQL代碼片段。 – 2009-09-28 16:58:18

+0

這在SQL Server中不起作用。 where子句引用tableb將內部連接更改爲內部連接。當我添加where子句時,它只給我提供了我在查看的字段中有空的記錄。如果我把它放在ID字段上,我仍然得到了錯誤的答案 – HLGEM 2009-09-28 17:30:41

1

您可以完全通過修正連接條件免受tableB的的「X型」記載:

SELECT 
    * 
FROM 
    tableA 
    LEFT OUTER JOIN ON 
    tableA.ID = tableB.ID 
    AND tableB.type = 'X' 
+0

他特別說它不能在ON子句中完成,但必須在WHERE子句中完成。 – RedFilter 2009-09-28 16:54:45

+1

該OP提到他不能修改加入聲明。 – 2009-09-28 16:55:48

+0

Aww,快照。你是對的,他做到了。 – Tomalak 2009-09-28 16:57:29

2

不知道,如果你有對數據庫的訪問,或者如果你要查詢tableB的專由於其他限制,但您始終可以創建一個名爲tableBTypeX的表b視圖,其中視圖僅限於類型爲= x的行。然後你可以將外連接留給tableBTypeX。在你的查詢中,連接列是ID列,因此它們可能具有索引,使得查詢在速度方面很好。在未對連接列進行索引的情況下,加入視圖會更有效率,因爲連接的行數更少,並且對未指定索引的行進行連接通常需要全表掃描,這使得查詢更耗時。

+0

您可能可以使用內聯視圖,而不是全視圖。 – 2009-09-28 17:27:45

1

UNION可能嗎?

SELECT * 
FROM tableA 
LEFT OUTER JOIN ON tableA.ID = tableB.ID 
WHERE tableB.type = 'X' 

UNION 

SELECT * 
FROM tableA 

...或CTE?不知道名字怎麼會tableB的解決,雖然並不能測試...

;WITH tableB AS 
(
    SELECT * FROM tableB WHERE type = 'X' 
) 
SELECT * 
FROM 
    tableA 
    LEFT OUTER JOIN 
    tableB ON tableA.ID = tableB.ID 
相關問題