4

ここに2つのテーブルがあります

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がない場合は、すべて)、maxを計算して、結果に入れます。

ただし、非集計フィールドも入力するため、その値が必要です。つまり、SQLが行うのは、ランダムな行を選択することだけです。あなたは「まあ、なぜそれは最大がしたのと同じ行を選ばないのですか?」と思うかもしれません。しかし、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 に答える