首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有关联子查询的更新查询不能通过表别名

具有关联子查询的更新查询不能通过表别名
EN

Stack Overflow用户
提问于 2020-09-23 08:58:09
回答 2查看 82关注 0票数 1

我在Server上有这个更新查询

代码语言:javascript
复制
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”附近的不正确语法

我在甲骨文上试过-效果很好。

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

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-23 09:02:02

不是在UPDATE子句中别名一个表,而是在FROM中这样做。由于这个语句中没有FROM,所以您不会给表提供别名。但是,这意味着您必须将查询中的所有别名更改为表的名称:

代码语言:javascript
复制
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子句中引用别名:

代码语言:javascript
复制
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),因为它会导致查询变成非SARGable。使用正确的布尔逻辑。而且,使用JOIN (而不是2个子查询)也可以使其变得更小。

代码语言:javascript
复制
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;
票数 3
EN

Stack Overflow用户

发布于 2020-09-23 09:55:18

简单查询,请按以下查询。其中使用联合查询结果和更新记录。

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64024414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档