m0_73105977 2025-09-24 17:01 采纳率: 0%
浏览 4

sqlserver 的From子句里面包含子查询能update成功吗

遇到一个更新表的问题,如下语句,update的from字句里面包含两个子查询,这种代码进行更新能成功吗

update  m set  m.FDOWNPRICE=floor(n.FTAXPRICE*1.13FROM (SELECT t6.fnumber,t5.FDOWNPRICE,t5.F_TUGQ_UpDate FROM T_SAL_PRICEENTRY t5 LEFT JOIN T_BD_MATERIAL t6 on   t5.FMATERIALID=t6.FMATERIALID) m  
JOIN  
(SELECT  t0.FDATE,t0.FMODIFYDATE,t6.fnumber,t3_F.FTAXPRICE,t3_F.FTAXRATE,t7.F_TQHH_MLL
FROM t_PUR_POOrder t0 
LEFT OUTER JOIN T_PUR_POORDERFIN t1 ON t0.FID = t1.FID 
LEFT OUTER JOIN t_PUR_POOrderEntry t3 ON t0.FID = t3.FID 
LEFT OUTER JOIN t_PUR_POOrderEntry_F t3_F ON t3.FENTRYID = t3_F.FENTRYID 
LEFT OUTER join T_BD_MATERIAL t6 on   t3.FMATERIALID=t6.FMATERIALID
LEFT OUTER join  T_BAS_PREBDONE t7 on t6.F_TUGQ_BASE=t7.fid 
) n  on  m.fnumber=n.fnumber  
WHERE n.FDATE>=m.F_TUGQ_UpDate

  • 写回答

3条回答 默认 最新

  • 檀越@新空间 2025-09-24 17:02
    关注

    下午好🌅🌅🌅
    本答案参考通义千问

    SQL Server 中,UPDATE 语句的 FROM 子句中 可以包含子查询,但需要注意以下几点:


    一、基本结论:

    是的,这种写法是可以成功的。
    SQL Server 允许在 UPDATEFROM 子句中使用子查询,只要语法正确且逻辑清晰。


    📌 二、关键注意事项:

    1. 必须为子查询指定别名(如 mn):

      • 如果没有别名,SQL Server 会报错。
      • 示例中的 mn 是正确的别名使用。
    2. 确保子查询返回的数据与更新字段兼容

      • 比如 m.FDOWNPRICE = floor(n.FTAXPRICE * 1.13) 中的 n.FTAXPRICE 必须存在,并且类型匹配。
    3. JOIN 条件必须合理

      • 在示例中,on m.fnumber = n.fnumber 是合理的,但需要确保 fnumber 字段在两个子查询中都存在且值一致。
    4. WHERE 条件不能引用未被选中的列

      • WHERE n.FDATE >= m.F_TUGQ_UpDate 是合法的,因为 FDATEF_TUGQ_UpDate 都来自子查询中的字段。
    5. 性能问题

      • 如果子查询结果集很大,可能会导致性能问题。
      • 可以考虑对相关字段建立索引,或者使用临时表/CTE 提前处理数据。

    三、修改后的代码示例(推荐格式):

    UPDATE m
    SET m.FDOWNPRICE = FLOOR(n.FTAXPRICE * 1.13)
    FROM (
        SELECT 
            t6.fnumber,
            t5.FDOWNPRICE,
            t5.F_TUGQ_UpDate
        FROM T_SAL_PRICEENTRY t5
        LEFT JOIN T_BD_MATERIAL t6 ON t5.FMATERIALID = t6.FMATERIALID
    ) AS m
    JOIN (
        SELECT 
            t0.FDATE,
            t0.FMODIFYDATE,
            t6.fnumber,
            t3_F.FTAXPRICE,
            t3_F.FTAXRATE,
            t7.F_TQHH_MLL
        FROM t_PUR_POOrder t0
        LEFT OUTER JOIN T_PUR_POORDERFIN t1 ON t0.FID = t1.FID
        LEFT OUTER JOIN t_PUR_POOrderEntry t3 ON t0.FID = t3.FID
        LEFT OUTER JOIN t_PUR_POOrderEntry_F t3_F ON t3.FENTRYID = t3_F.FENTRYID
        LEFT JOIN T_BD_MATERIAL t6 ON t3.FMATERIALID = t6.FMATERIALID
        LEFT JOIN T_BAS_PREBDONE t7 ON t6.F_TUGQ_BASE = t7.fid
    ) AS n
    ON m.fnumber = n.fnumber
    WHERE n.FDATE >= m.F_TUGQ_UpDate;
    

    🔍 四、常见错误排查建议:

    | 问题 | 解决方法 | |------|----------| | 缺少别名 | 确保每个子查询都有 AS 别名 | | 字段不存在 | 检查子查询中是否有 FTAXPRICE, FDATE, F_TUGQ_UpDate 等字段 | | 数据类型不匹配 | 确保 floor(n.FTAXPRICE * 1.13) 的结果能赋给 FDOWNPRICE | | JOIN 条件不唯一 | 使用 JOIN 时注意是否会出现多对多情况,可能导致意外更新 |


    🧠 五、优化建议:

    • 使用 CTE 或临时表:如果子查询非常复杂,建议用 WITH 或临时表来提高可读性。
    • 使用 EXISTS 替代 JOIN:如果只需要判断是否存在,可以使用 EXISTS
    • 添加 TOP 1DISTINCT:防止多行匹配导致的误更新。

    六、总结:

    SQL Server 支持在 UPDATEFROM 子句中使用子查询,只要语法正确、逻辑清晰、字段匹配,就可以成功执行。
    建议使用 AS 明确别名,避免歧义,并注意性能和数据一致性问题。

    如有更多具体错误信息或执行结果,欢迎继续提问!

    评论

报告相同问题?

问题事件

  • 创建了问题 9月24日