2013-11-28 65 views
0

我只是發現了這片的SQL代碼,返回包含最老的人行: 假設你有一個SQL表persons有兩列,nameage爲什麼此SQL代碼返回最大值?

SELECT p1.name, p1.age 
FROM persons p1 
LEFT JOIN persons p2 ON p1.age < p2.age 
WHERE p2.age IS NULL 

爲什麼這回最大?雖然我想我知道左連接做什麼,但我沒有得到這個例子,因爲它使用同一個表兩次。

有人可以解釋這裏發生了什麼?我真的很想學這個。

回答

1

左連接將返回的值限制爲僅在p2中的年齡大於p1中的年齡的行,WHERE子句然後表示僅返回行,其中p2.age IS NULL,只能有一個值在p1中不存在值高於p2的值;最高值(鑑於表格是相同的數據,最高值不能有更高的值)。

將加入更改爲p1.age > p2.age將返回最低年齡。

編輯 - 替代的解決方案

我覺得可能是一種更有效的方式來獲得相同的結果將是:

SELECT p1.Name, p1.Age 
FROM persons p1 
INNER JOIN (
    SELECT max(p2.age) As MaxAge FROM persons p2) As q ON (p1.age = q.MaxAge) 

或許

SELECT p1.Name, p1.Age 
FROM persons p1 
WHERE p1.age = (SELECT max(p2.age) As MaxAge FROM persons p2) 

不是SQL主如此可能有更好的方法,從粗略瀏覽一下他們(上述兩個替代方案)的執行計劃看起來他們正在做同樣的事情,但我正在處理少量數據。

0

注意:這是非常低效的代碼。基本上,它會創建一個臨時的記錄集 選擇p1.name,p1.age 向個人P1 LEFT JOIN人P2 ON p1.age < p2.age

對於每個P1,它會顯示所有比較老的p2。

當您添加

WHERE p2.age IS NULL 

它會顯示在P1,那裏沒有一個是舊的。對效率

**側的一個**

與問題是

FROM persons p1 
LEFT JOIN persons p2 ON p1.age < p2.age 

創建一個特設的記錄集即1/2(人數)^ 2

+0

是的,沒錯。但是如何調用這個SQL技巧? – cha

+0

你在尋找一個像「笛卡兒連接」這樣的正式名字嗎? –

相關問題