1

この更新をしようとしていますが、何らかの理由で SQL サブクエリを完全にマスターできません。

私のテーブル構造は次のとおりです。

 id  fk    date     activeFlg
---  --  -------    ---------
 1   1   04/10/11      0
 2   1   02/05/99      0
 3   2   09/10/11      0
 4   3   11/28/11      0
 5   3   12/25/98      0

理想的には、最新の日付を持つすべての個別の外部キーに対して、activeFlg を 1 に設定したいと考えています。たとえば、クエリ ID 1、3、および 4 を実行すると、アクティブ フラグが 1 に設定されます。

私が思いついた最も近いものは、個別の fk ごとに最大日付をすべて返すクエリでした。

SELECT MAX(date)
FROM table
GROUP BY fk

しかし、サブクエリを思いつくことさえできないので、先に進む方法はありません:/

誰かが私にこれについての洞察を教えてください。サブクエリについてもっと学びたいと思っているので、説明をいただければ幸いです。

ありがとうございました!

4

2 に答える 2

0

fk を選択してから制限する必要があるため、

SELECT fk,MAX(date)
FROM table
GROUP BY fk

With Ones2update AS
(
  SELECT fk,MAX(date)
  FROM table
  GROUP BY fk
)
Update table
  set Active=1
from table t
join Ones2update u ON t.fk = u.fk and t.date = u.date

また、最初にテストするので、最初にこのクエリを実行します

With Ones2update AS
(
  SELECT fk,MAX(date)
  FROM table
  GROUP BY fk
)
selct fk, date, active 
from table t
join Ones2update u ON t.fk = u.fk and t.date = u.date

期待どおりの結果が得られていることを確認してください。タイプミスはありません。

追加の注意: サブクエリの代わりに結合を使用します。論理的には同じですが、結合の使用に慣れると、結合がより明確になることが常にわかります。オプティマイザーによっては、より高速になる場合があります。

于 2013-02-18T23:18:16.633 に答える
0

これが一般的な考え方です。細部まで肉付けできます。

update t
set activeFlg = 1
from yourTable t
join (
select id, max([date] maxdate
from TheForeignKeyTable
group by [date]
)  sq on t.fk = sq.id and t.[date] = maxdate
于 2013-02-18T23:50:37.420 に答える