具有相关子查询的更新查询无法通过 table 别名

Update query with correlated subquery can't go through table alias

我的 SQL 服务器上有这个更新查询

UPDATE BK_TT_DELIVERY_PLAN TDP
SET (PACK_TYPE) = 
            (SELECT OPD.PACKING_TYPE
               FROM TT_OM_PACK_DISCREPANCY OPD
              WHERE ISNULL(TDP.PO_REF,TDP.PO_NUMBER) = OPD.PO_NUMBER
                    AND TDP.PO_ITEM = ODP.PO_ITEM)
WHERE 
    EXISTS (SELECT 1
            FROM TT_OM_PACK_DISCREPANCY OPD
            WHERE ISNULL(TDP.PO_REF,TDP.PO_NUMBER) = OPD.PO_NUMBER
              AND TDP.PO_ITEM = ODP.PO_ITEM) 

当我尝试执行时,我总是得到这个错误:

Lookup Error - SQL Server Database Error: Incorrect syntax near 'TDP'

我在 Oracle 上试了一下 - 它工作正常。

这个问题有什么解决方法吗?

谢谢。

您不要在 UPDATE 子句中为 table 添加别名,而是在 FROM 中这样做。由于此语句中没有 FROM,因此您不给 table 别名。但是,这意味着您必须将查询中的所有别名更改为 table 的名称:

UPDATE dbo.BK_TT_DELIVERY_PLAN
   SET (PACK_TYPE) = 
            (SELECT OPD.PACKING_TYPE
               FROM TT_OM_PACK_DISCREPANCY OPD
              WHERE ISNULL(BK_TT_DELIVERY_PLAN.PO_REF,BK_TT_DELIVERY_PLAN.PO_NUMBER) = OPD.PO_NUMBER
                    AND BK_TT_DELIVERY_PLAN.PO_ITEM = ODP.PO_ITEM)
 WHERE EXISTS
      (SELECT 1
         FROM TT_OM_PACK_DISCREPANCY OPD
              WHERE ISNULL(BK_TT_DELIVERY_PLAN.PO_REF,BK_TT_DELIVERY_PLAN.PO_NUMBER) = OPD.PO_NUMBER
                    AND BK_TT_DELIVERY_PLAN.PO_ITEM = ODP.PO_ITEM);

因此使用 FROM 可能是一个更好的主意,然后您在 UPDATE 子句中引用别名:

UPDATE TDP
   SET (PACK_TYPE) = 
            (SELECT OPD.PACKING_TYPE
               FROM TT_OM_PACK_DISCREPANCY OPD
              WHERE ISNULL(TDP.PO_REF,TDP.PO_NUMBER) = OPD.PO_NUMBER
                    AND TDP.PO_ITEM = ODP.PO_ITEM)
FROM dbo.BK_TT_DELIVERY_PLAN TDP
WHERE EXISTS
      (SELECT 1
         FROM TT_OM_PACK_DISCREPANCY OPD
              WHERE ISNULL(TDP.PO_REF,TDP.PO_NUMBER) = OPD.PO_NUMBER
                    AND TDP.PO_ITEM = OPD.PO_ITEM);

另外注意,您不应该使用 ISNULLWHERE(或 ON),因为它会导致查询变为 non-SARGable。使用正确的布尔逻辑。似乎也可以使用 JOIN 而不是 2 个子查询使它变得更小。

UPDATE TDP
SET PACK_TYPE = OPD.PACKING_TYPE
FROM dbo.BK_TT_DELIVERY_PLAN TDP
     JOIN TT_OM_PACK_DISCREPANCY OPD ON (TDP.PO_REF = OPD.PO_NUMBER 
                                     OR  (TDP.PO_REF IS NULL AND TDP.PO_NUMBER = OPD.PO_NUMBER))
                                    AND TDP.PO_ITEM = OPD.PO_ITEM;

简单查询,请按以下查询。 Where use joined query result and update records.

UPDATE TDP
SET TDP.PACK_TYPE = OPD.PACKING_TYPE
FROM dbo.BK_TT_DELIVERY_PLAN TDP
LEFT OUTER JOIN TT_OM_PACK_DISCREPANCY OPD ON ISNULL(TDP.PO_REF,TDP.PO_NUMBER) = OPD.PO_NUMBER AND TDP.PO_ITEM = ODP.PO_ITEM
WHERE OPD.PACKING_TYPE IS NOT null