別のテーブルからのトリガーでテーブルを更新しようとしています。これは非常に単純なクエリだと思っていましたが、最初に思いついたクエリが機能せず、その理由がわかりません。
CREATE TABLE [dbo].[Vehicle](
[id] [int] IDENTITY(1,1) NOT NULL,
[plate] [nvarchar](50) NOT NULL,
[name] [nvarchar](50) NOT NULL,
[dateUsed] [datetime] NULL
)
CREATE TABLE [dbo].[Transaction](
[id] [int] IDENTITY(1,1) NOT NULL,
[vehicleId] [int] NOT NULL,
[quantity] [float] NOT NULL,
[dateTransaction] [datetime] NOT NULL,
)
トランザクションが追加されたら、Vehicle テーブルを更新したいと考えています。追加された日付dateTransaction
が後である場合は、その特定の車両の最新の日付がフィールドに常に含まdateUsed
れるように更新する必要があります。dateUsed
私はこのトリガーがトリックを行うべきだと思います..しかし、そうではありません:
UPDATE [Vehicle]
SET [dateUsed] =
CASE
WHEN [dateUsed] < [Transaction].[dateTransaction]
OR [dateUsed] IS NULL
THEN [Transaction].[dateTransaction]
ELSE [dateUsed]
END
FROM [Transaction]
WHERE [Vehicle].[id]=[Transaction].[vehicleId]
私にはよさそうです...新しく挿入されたすべてのレコードを調べて、dateUsed
フィールドを更新する必要があります。が新しい場合はdateTransaction
、それを使用します。そうでない場合は、現在のものを使用します。しかし、最新の日付に更新されていないため、何かが欠けているようです。その特定の車両のトランザクションの 1 つには一致しますが、最新のトランザクションには一致しません。
機能するクエリ:
UPDATE [Vehicle]
SET [dateUsed] = InsertedPartitioned.[dateTransaction]
FROM [Vehicle]
LEFT JOIN (
SELECT
[vehicleId],
[dateTransaction],
ROW_NUMBER() OVER(PARTITION BY [VehicleId] ORDER BY [dateTransaction] DESC) AS RC
FROM [Inserted]) AS InsertedPartitioned
ON InsertedPartitioned.RC=1
AND InsertedPartitioned.[vehicleId]=[Vehicle].[id]
WHERE InsertedPartitioned.[vehicleId] IS NOT NULL
AND ([Vehicle].[dateUsed] IS NULL
OR InsertedPartitioned.[dateTransaction] > [Vehicle].[dateUsed]);
だから私は実用的な解決策を持っており、それはより良いかもしれません(大きな挿入でそれを計っていません)が、最初にそれが機能しない理由がわからないので、それは私の地獄から抜け出します!
誰でも「私を啓発」できますか?