4

我这里有两张桌子

BIODATA
ID                    NAME
1                     A
2                     B

YEAR
ID                    JOIN YEAR            GRADUATE YEAR
1                     1990                 1991
2                     1990                 1993

我已经在使用

select 
    NAME, 
    max(year(JOIN_YEAR) - year(GRADUATE_YEAR)) as MAX 
from 
    DATA_DIRI 
right join DATA_KARTU 
    ON BIODATA.ID = YEAR.ID;

但结果变成了:

+--------+------+
| NAME   | MAX  |
+--------+------+
| A      | 3    |
+--------+------+

我已经尝试了很多不同类型的连接,但我仍然找不到 NAME 如何成为“B”。任何人都可以帮助我吗?之前非常感谢

4

1 回答 1

2

如果您同时在选择集中使用聚合和非聚合,则用于非聚合字段的行基本上是随机选取的。

基本上, max 的工作原理是这样的 - 它通过查询收集每个组的所有行(如果没有 group by,则所有行),计算最大值并将其放入结果中。

但是由于您还输入了一个非聚合字段,因此它需要一个值 - 所以 SQL 所做的只是选择一个随机行。您可能会想“好吧,为什么它不选择与 max 相同的行呢?” 但是如果你使用 avg 或 count 呢?这些没有与之关联的行,所以它可以做的最好的就是随机选择。这就是为什么这种行为普遍存在的原因。

您需要做的是使用子查询。就像是select d1.id from data_diri d1 where d1.graduate_year - d1.join_year = (select max(d2.graduate_year - d2.join_year from data_diri d2))

于 2013-03-05T06:07:00.590 回答