2

Microsoft Access 2003に問題があり、次のステートメントについて不平を言っています。

select cardnr
from change
where  year(date)<2009
group by cardnr
having max(time+date) = (time+date) and cardto='VIP'

私がやりたいのは、テーブルの変更ごとに異なるcardnrごとに、2009年より前の最新(時刻+日付)の行を見つけて、cardto='VIP'の行を選択することです。

このバリデーターは大丈夫だと言っていますが、Accessは大丈夫ではないと言っています。

これは私が受け取るメッセージです:「指定された式'max(time + date)= time + date and cardto ='VIP'andcardnr='を集計関数の一部として含まないクエリを実行しようとしました。」

誰かが私が間違っていることとそれを行う正しい方法を説明してもらえますか?ありがとう

注:フィールド名とテーブル名は翻訳されており、予約語と衝突しません。名前に問題はありません。

4

1 に答える 1

3

このように考えてみてください-集約が行われた後にHAVINGが適用されます。したがって、集計されていない式と比較することはできません(時刻+日付でもcardtoでも)。

ただし、最後の(原則はweelとして他の集約関数に関連する行を取得する場合と同じです)日時を取得するには、次のようにすることができます。

SELECT cardnr
FROM change main
WHERE time+date IN (SELECT MAX(time+date) 
                    FROM change sub
                    WHERE sub.cardnr = main.cardnr AND 
                          year(date)<2009 
                          AND cardto='VIP')

(時間フィールドの日付部分がすべてのレコードで同じであると仮定します。日付/時刻に2つのフィールドがあることは最善の利益ではなく、フィールド名に予約語を使用すると、場合によっては裏目に出る可能性があります)

サブクエリは、外部クエリから関心のあるレコードでのみフィルタリングされるため、これは機能します。

同じyear(date)<200およびcardto ='VIP'を外部クエリに適用すると、パフォーマンスをさらに向上させることができます。

于 2010-04-19T20:35:05.217 に答える