从具有不同特定列的两个表中提取记录

时间:2012-12-09 14:36:29

标签: sql

有没有更好的方法来编写此查询:

    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列中的一列,如果它们已被修改,则会生成车辆列表和日期/时间,以便触发可以执行重新计算受影响记录的存储过程。

1 个答案:

答案 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分隔。