29

このレコードの最大値を取得したい。私を助けてください:

SELECT rest.field1 
    FROM mastertable AS m
    INNER JOIN  (
        SELECT t1.field1 field1, 
               t2.field2
            FROM table1 AS T1 
            INNER JOIN table2 AS t2 ON t2.field = t1.field 
            WHERE t1.field3=MAX(t1.field3)
        --                  ^^^^^^^^^^^^^^  Help me here.
    ) AS rest ON rest.field1 = m.field
4

6 に答える 6

42

お気づきのように、WHERE句では集計を使用できません。そのためのHAVING条項です。

HAVING t1.field3=MAX(t1.field3)
于 2009-09-25T15:34:56.623 に答える
31

サブクエリを使用できます...

WHERE t1.field3 = (SELECT MAX(st1.field3) FROM table1 AS st1)

しかし、実際にはこれを where 句から join ステートメントに移動し、ON 句の AND として使用します。

于 2009-09-25T05:43:51.263 に答える
9

having 句で max を使用する正しい方法は、最初に自己結合を実行することです。

select t1.a, t1.b, t1.c
from table1 t1
join table1 t1_max
  on t1.id = t1_max.id
group by t1.a, t1.b, t1.c
having t1.date = max(t1_max.date)

サブクエリと結合する方法は次のとおりです。

select t1.a, t1.b, t1.c
from table1 t1
where t1.date = (select max(t1_max.date)
                 from table1 t1_max
                 where t1.id = t1_max.id)

複数テーブルの結合を処理する場合は、集計を使用する前に、必ず単一のデータセットを作成してください。

select t1.id, t1.date, t1.a, t1.b, t1.c
into #dataset
from table1 t1
join table2 t2
  on t1.id = t2.id
join table2 t3
  on t1.id = t3.id


select a, b, c
from #dataset d
join #dataset d_max
  on d.id = d_max.id
having d.date = max(d_max.date)
group by a, b, c

サブクエリのバージョン:

select t1.id, t1.date, t1.a, t1.b, t1.c
into #dataset
from table1 t1
join table2 t2
  on t1.id = t2.id
join table2 t3
  on t1.id = t3.id


select a, b, c
from #dataset d
where d.date = (select max(d_max.date)
                from #dataset d_max
                where d.id = d_max.id)
于 2013-07-17T21:07:13.167 に答える
5
SELECT rest.field1
FROM mastertable as m
INNER JOIN table1 at t1 on t1.field1 = m.field
INNER JOIN table2 at t2 on t2.field = t1.field
WHERE t1.field3 = (SELECT MAX(field3) FROM table1)
于 2009-09-25T06:02:31.620 に答える
1

はい、Group by句の後にhaving句を使用する必要があります.whereは単純なパラメータでデータをフィルタリングするだけですが、group byの後にHavingステートメントが続くのは、データをグループ化し、いくつかの集計に基づいてフィルタリングするという考えです.関数......

于 2012-03-26T16:35:15.833 に答える
1

しかし、それでもクエリ ビルダでエラー メッセージが表示されます。SqlServerCe 2008 を使用しています。

SELECT         Products_Master.ProductName, Order_Products.Quantity, Order_Details.TotalTax, Order_Products.Cost, Order_Details.Discount, 
                     Order_Details.TotalPrice
FROM           Order_Products INNER JOIN
                     Order_Details ON Order_Details.OrderID = Order_Products.OrderID INNER JOIN
                     Products_Master ON Products_Master.ProductCode = Order_Products.ProductCode
HAVING        (Order_Details.OrderID = (SELECT MAX(OrderID) AS Expr1 FROM Order_Details AS mx1))

@powerlordが言ったように、WHEREをHAVINGに置き換えました。しかし、まだエラーが表示されます。

クエリの解析中にエラーが発生しました。[トークン行番号 = 1、トークン行オフセット = 371、エラーのトークン = SELECT]

于 2013-11-07T04:39:00.117 に答える