首页 > 解决方案 > 使用多个表更新列时出错

问题描述

更新列时,我收到异常消息:

关键字“ON”附近的语法不正确。

UPDATE item_t0   SET
item_t0.p_enddate=DATEADD(day, 10, item_t0.p_enddate)
FROM employee item_t0
WHERE EXISTS(SELECT '1' FROM
orders item_t2 ON  item_t2.p_id  =  item_t0.p_subsid  JOIN 
departs item_t4 ON  item_t4.PK = item_t0.p_contract  JOIN 
constantvalues3b item_t1 ON  item_t0.p_status  =  item_t1.PK   
WHERE 
 item_t0.p_startdate  > 'Aug 10, 2020 12:00:00 AM' and  item_t0.p_enddate  < 'Sep 10, 2020 12:00:00 AM'
                 AND  item_t1.Code  in('Active')
                 AND  item_t0.p_planid ='asdcg'
                AND item_t0.customer='1234567'
                 )

标签: sqlsql-servertsql

解决方案


您似乎正在尝试将您的子查询加入到父查询中,这在这种格式中是不可能的。而是将其移至 where 子句的一部分。

注意:我强烈建议您花时间以一种简洁的逻辑方式来布局您的查询 - 更容易调试。

UPDATE item_t0 SET
    item_t0.p_enddate = DATEADD(day, 10, item_t0.p_enddate)
FROM employee item_t0
WHERE EXISTS (
    SELECT '1'
    FROM orders item_t2
    -- Move to where clause
    -- ON  item_t2.p_id  =  item_t0.p_subsid
    JOIN departs item_t4 ON item_t4.PK = item_t0.p_contract
    JOIN constantvalues3b item_t1 ON item_t0.p_status = item_t1.PK   
    WHERE item_t0.p_startdate > 'Aug 10, 2020 12:00:00 AM' and item_t0.p_enddate < 'Sep 10, 2020 12:00:00 AM'
    AND item_t1.Code in ('Active')
    AND item_t0.p_planid = 'asdcg'
    AND item_t0.customer = '1234567'

    -- Moved fdrom attemped join
    AND item_t2.p_id  =  item_t0.p_subsid
)

推荐阅读