为什么这个SQL代码返回最大值?

时间:2013-11-28 22:31:08

标签: sql join left-join relational-algebra database-table

我刚发现这段SQL代码返回包含最老的人的行: 假设您有一个SQL表persons,其中包含两列nameage

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

为什么这会返回最大值?虽然我认为我知道左连接的作用,但我没有得到这个例子,因为它使用了两次相同的表。

有人能解释一下这里发生了什么吗?我真的很想学这个。

2 个答案:

答案 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