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'?
作爲複雜查詢的一部分,但被簡化爲可以解答我的問題。
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'?
作爲複雜查詢的一部分,但被簡化爲可以解答我的問題。
這是一個基本的not exists
;
select a.*
from tableA a
where not exists (select 1
from tableB b
where a.clientId = b.clientId and b.clientcode = 'TRN'
);
這裏更多 - https://technet.microsoft.com/en-us/library/ms184297(v=sql.105).aspx
不存在完美的作品是寫這個邏輯上直接的方式,但並不總是最高效的選擇。使用一個不依賴於數據庫系統的算法可以將查詢平坦化,以避免逐行運行。有了這個簡單的查詢,數據庫系統可能會弄清楚,但你可以把它寫成扁平的方式。
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'不存在,所以那麼空檢查就等同於另一個查詢中不存在,但是避免逐行檢查相關的子查詢並且應該快得多。
有趣的變化!謝謝埃文。 – Dev
*必須爲每行單獨運行*:不正確。沒有規則將SQL實現限制爲特定的*方式來執行某些操作。事實上,大多數DBMS在可行的情況下會將相關子查詢「變平」。如果您在您的DBMS中找到兩個邏輯上等效的最小查詢的示例,其中相關子查詢的執行與外部聯接顯着不同,但沒有記錄,我建議您提交問題報告。這不是一個錯誤,但它是一個優化機會。 –
@ JamesK.Lowden我編輯了我的帖子以使其軟化並允許查詢的DBMS優化。 –