0

別のテーブルからのトリガーでテーブルを更新しようとしています。これは非常に単純なクエリだと思っていましたが、最初に思いついたクエリが機能せず、その理由がわかりません。

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]);

だから私は実用的な解決策を持っており、それはより良いかもしれません(大きな挿入でそれを計っていません)が、最初にそれが機能しない理由がわからないので、それは私の地獄から抜け出します!

誰でも「私を啓発」できますか?

4

1 に答える 1