0

我在触发器中看到了这个 SQL Update 语句,并且不确定更新是否准确 - 基于查看表别名的位置和更新表语法。

该语法在执行时不会给出任何错误,并且在我的测试数据库上的随机样本上执行时会正确更新记录。

但是,在具有更多记录的较大 PROD DB 上,是否有可能更新失败或完全跳过?有报告称随机记录没有设置 SAMPLE.ISCOMPOSITESAMPLE 字段。

有问题的语法

UPDATE SAMPLE SET 
    SAMPLE.SAMPLETYPE = (SELECT DESCRIPTION FROM SAMPLETYPE WHERE SAMPLETYPENO = C.SAMPLETYPENO),
    SAMPLE.ISCOMPOSITESAMPLE = (SELECT COMPOSITESAMPLE FROM SAMPLETYPE WHERE SAMPLETYPENO = C.SAMPLETYPENO)
FROM SAMPLE C 
INNER JOIN INSERTED T ON C.SAMPLENO = T.SAMPLENO 

我熟悉的语法(类似于上面,但故意不为比较而优化)

UPDATE C SET 
    SAMPLETYPE = (SELECT DESCRIPTION FROM SAMPLETYPE WHERE SAMPLETYPENO = C.SAMPLETYPENO),
    ISCOMPOSITESAMPLE = (SELECT COMPOSITESAMPLE FROM SAMPLETYPE WHERE SAMPLETYPENO = C.SAMPLETYPENO)
FROM SAMPLE C 
INNER JOIN INSERTED T ON C.SAMPLENO = T.SAMPLENO
4

1 回答 1

0

查询是正确的并且可以工作。但是,有两件事我要解决:

  • UPDATE SAMPLE确实会更新别名为 的表C。这被记录为正确的并且确实让我感到厌烦,因为应该尊重别名。您应该使用别名进行更新。
  • 相关子查询未使用完全限定的列名。

因此,使用相关子查询,我建议:

UPDATE S 
    SET SAMPLETYPE = (SELECT ST.DESCRIPTION FROM SAMPLETYPE ST WHERE ST.SAMPLETYPENO = S.SAMPLETYPENO),
        ISCOMPOSITESAMPLE = (SELECT ST.COMPOSITESAMPLE FROM SAMPLETYPE ST WHERE ST.SAMPLETYPENO = S.SAMPLETYPENO)
FROM SAMPLE S INNER JOIN
     INSERTED I
     ON S.SAMPLENO = I.SAMPLENO ;

您还可以使用以下命令编写此代码(可能更有效)LEFT JOIN

UPDATE S 
    SET SAMPLETYPE = ST.DESCRIPTION,
        ISCOMPOSITESAMPLE = ST.COMPOSITESAMPLE
FROM SAMPLE S INNER JOIN
     INSERTED I
     ON S.SAMPLENO = I.SAMPLENO LEFT JOIN
     SAMPLETYPE ST 
     ON ST.SAMPLETYPENO = S.SAMPLETYPENO;
于 2019-09-09T10:55:19.987 回答