具有相关子查询的更新查询无法通过 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);
另外注意,您不应该使用 ISNULL
是 WHERE
(或 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
我的 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);
另外注意,您不应该使用 ISNULL
是 WHERE
(或 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