2016-11-11 31 views
1

表A如何通過在表A與表B中的一個特定的排除

clientId clientPassword 
1   1234 
2   1234 
3   1234 

表B中選擇行得到查詢

clientId  clientCode 
1    TRN 
2    ABC 
3    CDE 
3    TRN 

會是怎樣的查詢與只有那些clientID的選擇TableA.clientPassword TableB.clientCode中沒有'TRN'?

作爲複雜查詢的一部分,但被簡化爲可以解答我的問題。

回答

1

不存在完美的作品是寫這個邏輯上直接的方式,但並不總是最高效的選擇。使用一個不依賴於數據庫系統的算法可以將查詢平坦化,以避免逐行運行。有了這個簡單的查詢,數據庫系統可能會弄清楚,但你可以把它寫成扁平的方式。

SELECT a.* 
    FROM TableA a LEFT JOIN TableB b ON a.clientId = b.clientid 
            AND b.clientcode = 'TRN' 
WHERE b.ClientId IS NULL 

爲了解釋這一點的左連接將加入B表對錶A,其中ID的比賽和clientcode是「TRN」,但將保持在表格中的所有條目,並具有表B中的NULL當記錄'TRN'不存在,所以那麼空檢查就等同於另一個查詢中不存在,但是避免逐行檢查相關的子查詢並且應該快得多。

+0

有趣的變化!謝謝埃文。 – Dev

+0

*必須爲每行單獨運行*:不正確。沒有規則將SQL實現限制爲特定的*方式來執行某些操作。事實上,大多數DBMS在可行的情況下會將相關子查詢「變平」。如果您在您的DBMS中找到兩個邏輯上等效的最小查詢的示例,其中相關子查詢的執行與外部聯接顯着不同,但沒有記錄,我建議您提交問題報告。這不是一個錯誤,但它是一個優化機會。 –

+0

@ JamesK.Lowden我編輯了我的帖子以使其軟化並允許查詢的DBMS優化。 –

相關問題