我刚发现这段SQL代码返回包含最老的人的行:
假设您有一个SQL表persons
,其中包含两列name
和age
:
SELECT p1.name, p1.age
FROM persons p1
LEFT JOIN persons p2 ON p1.age < p2.age
WHERE p2.age IS NULL
为什么这会返回最大值?虽然我认为我知道左连接的作用,但我没有得到这个例子,因为它使用了两次相同的表。
有人能解释一下这里发生了什么吗?我真的很想学这个。
答案 0 :(得分:1)
左连接将返回值限制为仅p2
中的年龄大于p1
中的年龄的行,WHERE
子句仅表示返回{{1}的行} {} 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)
不是SQL大师所以可能有更好的方法,从粗略地看一眼执行计划他们(上面的两个替代方案)看起来他们正在做同样但我正在处理少量数据。 / p>
答案 1 :(得分:0)
注意:这是非常低效的代码。基本上它会创建一组特殊的记录 SELECT p1.name,p1.age 来自人p1 LEFT JOIN人员p2 ON p1.age&lt; 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