2016-11-21 60 views
0

看到一位同事今天運行查詢,我無法解釋爲什麼或者它沒有失敗。 查詢被(抽象):爲什麼具有無效子查詢的查詢會運行?

UPDATE table1 
SET columnToUpdate = 1 
WHERE recordID IN (
SELECT recordID FROM table2 WHERE table2column IN (*list of values*)) 

問題是他有錯的recordId,這是僅在表1目前,對於PERSONID,這是目前在兩個表中,並且是PK在表1,FK在表2.

我會以爲查詢不會運行,由於子選擇無法解決(事實上,如果你單獨運行子選擇,它會失敗)。 而是,運行上述查詢更新了table1中以前爲NULL和0的組合的所有記錄。

修復起來很簡單,但任何人都可以解釋爲什麼會發生此行爲?

謝謝!

+1

您的意思是內部選擇失敗?您的意思是給出錯誤或返回null? –

+2

這就是相關子查詢是如何工作的。當然,修復起來很容易,但如果您將編碼習慣改爲始終在列前指定表格,您將極大地減少這些類型的錯誤。 –

回答

2

它被稱爲相關子查詢。它可以幫助你參考子查詢

recordID列從table1在子查詢從table2那就是當你單獨運行子查詢它爲什麼失敗未提及內外部查詢列。通常情況下,您可以在Where子句中看到使用EXISTS/NOT EXISTS的外部查詢列

+0

好的答案,我可以看到它爲什麼現在運行,但後續問題是 - 爲什麼它更新table1中的每個值?是否在選擇本質上產生table1中的所有東西的笛卡爾積對table2中的任何東西進行檢查? (即所有table1) – David

+1

它更新了所有記錄,因爲如果選擇了table2中的任何行,那麼您選擇Table1.RecordId作爲那些行中的單個值 - 因此Table1.RecordId IN(Table1.RecordId)爲true,如果有任何行根本沒有選擇 – Cato

3

由於這些原因,總是別名您的表並在字段名中使用別名,否則一個簡單的錯誤可能會使SQL(正確)將該字段解釋爲來自表以外的表 - 來自您想要的表的記錄 - 如果它不在表2中,則查詢是來自Table1的查詢

UPDATE table1 t1 
SET t1.columnToUpdate = 1 
    WHERE t1.recordID IN (
    SELECT t2.recordID FROM table2 t2 WHERE t2.table2column IN (*list of values*)) 
相關問題