Subquery
子查詢如何使用主查詢列?
我真的對這裡的 SQL 感到困惑,它在我們的應用程序中使用,但我不知道它是如何工作的。我從網上找到的範例中輸入了它,它似乎沒有問題。
它正在做的是獲取一組最新的時間戳。我們不能使用
ORDER BY
,因為必須有多個分組。實際查詢要大得多,這只是顯示基本選擇的縮減版本。select * from table1 as main WHERE NOT (EXISTS (select * from table1 sub WHERE sub.datetime > main.datetime));
(線上直播版:http ://sqlfiddle.com/#!17/290cc/2 )
我認為應該在我腦海中發生的事情:
選擇了兩個相同的表,子查詢中的約束是:
僅從子查詢中選擇日期大於主查詢中任何其他行的行。
在這種情況下:
- 子查詢 id:1 在主查詢中的所有行中只有一個小於或等於日期值,因此它不會被選中。
- 子查詢 id:2 的日期大於主查詢選擇中的 id:1,因此 id:2 被選中一次。它並不比其他任何東西大。
- 子查詢 id:3 的日期大於主查詢選擇中的 id:1 和 id:2,因此它被選擇了兩次。
所以子查詢的返回應該是 (2, 3, 3)。所以主查詢應該做一個在那個集合中不存在的選擇,它應該返回 id:1,但它返回 id:3。
我的誤解在哪裡?
好吧,關於子查詢在做什麼存在一些誤解。
首先,
EXISTS
在這種情況下,通過評估主查詢的每一行的子查詢,true
如果子查詢甚至返回單行,則返回。由於您使用
WHERE NOT EXISTS(....)
的是 ,因此主查詢中每一行的情況如下:
- For
id = 1
:子查詢評估同一個表中是否存在日期大於日期的行id = 1
。結果將是 ids 2 和 3,因此EXISTS
計算結果為true
,並NOT EXISTS
消除了這一行- For
id = 2
:與之前相同,在這種情況下,子查詢將返回 id 3,因此EXISTS
計算結果為true
,並NOT EXISTS
刪除該行- For
id = 3
:此表中沒有其他行的日期大於它,因此EXISTS
計算結果為false
,並NOT EXISTS
返回true
,因此您得到此行作為結果