我在Server上有这个更新查询
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) 当我试图执行时,我总是会得到以下错误:
查找错误- Server数据库错误:“TDP”附近的不正确语法
我在甲骨文上试过-效果很好。
这个问题有什么解决办法吗?
谢谢。
发布于 2020-09-23 09:02:02
不是在UPDATE子句中别名一个表,而是在FROM中这样做。由于这个语句中没有FROM,所以您不会给表提供别名。但是,这意味着您必须将查询中的所有别名更改为表的名称:
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),因为它会导致查询变成非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;发布于 2020-09-23 09:55:18
简单查询,请按以下查询。其中使用联合查询结果和更新记录。
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 nullhttps://stackoverflow.com/questions/64024414
复制相似问题