有没有更好的方法来编写此查询:
INSERT INTO #Temp (MinDateTime, VehicleID)
SELECT Min(CAST(RDate AS smalldatetime) + RTime) as MinDateTime, T.VehicleID
FROM (
SELECT D.RDate, D.RTime, D.VehicleID
FROM DELETED AS D
JOIN INSERTED AS I ON D.ReceiptID = I.ReceiptID
AND (D.[RDate] <> I.[RDate] OR D.[RTime] <> I.[RTime] OR D.VehicleID <> I.VehicleID OR D.Liters <> I.Liters OR D.OdometerReading <> I.OdometerReading)
UNION ALL
SELECT I.RDate, I.Rtime, I.VehicleID
FROM INSERTED AS I
JOIN DELETED AS D ON I.ReceiptID = D.ReceiptID
AND (I.[RDate] <> D.[RDate] OR I.[RTime] <> D.[RTime] OR I.VehicleID <> D.VehicleID OR I.Liters <> D.Liters OR I.OdometerReading <> D.OdometerReading)
UNION ALL
SELECT D.RDate, D.RTime, D.VehicleID
FROM DELETED AS D
LEFT JOIN INSERTED AS I ON D.ReceiptID = I.ReceiptID
WHERE I.ReceiptID IS NULL
UNION ALL
SELECT I.RDate, I.Rtime, I.VehicleID
FROM INSERTED AS I
LEFT JOIN DELETED AS D ON I.ReceiptID = D.ReceiptID
WHERE D.ReceiptID IS NULL
) AS T
GROUP BY T.VehicleID
ORDER BY MinDateTime, T.VehicleID
这是更新后触发器的一部分,该触发器评估已删除/添加/插入的记录,并查看5列中的一列,如果它们已被修改,则会生成车辆列表和日期/时间,以便触发可以执行重新计算受影响记录的存储过程。
答案 0 :(得分:1)
我怀疑内部查询可以写成:
SELECT D.RDate, D.RTime, D.VehicleID
FROM DELETED D full outer JOIN
INSERTED I
ON D.ReceiptID = I.ReceiptID
where ((D.[RDate] <> I.[RDate] OR D.[RTime] <> I.[RTime] OR D.VehicleID <> I.VehicleID OR D.Liters <> I.Liters OR D.OdometerReading <> I.OdometerReading) or
(I.[RDate] <> D.[RDate] OR I.[RTime] <> D.[RTime] OR I.VehicleID <> D.VehicleID OR I.Liters <> D.Liters OR I.OdometerReading <> D.OdometerReading) or
I.ReceiptID IS NULL or
D.ReceiptID IS NULL
) and
(coalesce(i.ReceiptId, d.receiptId) is not null) -- check that at least one has a value
换句话说,我用full outer join
替换了联合序列,然后将所有条件放在where
子句中,由or
s分隔。