Subquery

子查詢如何使用主查詢列?

  • August 24, 2017

我真的對這裡的 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,因此您得到此行作為結果

引用自:https://dba.stackexchange.com/questions/184251