You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用给定的CROSS APPLY语句实现SQL数据表更新?

问题

我知道可以在UPDATE的FROM子句后添加SELECT语句,但当前查询中的CROSS APPLY内部包含SELECT子句,请问该如何编写对应的UPDATE语句来更新数据表?

相关查询代码如下:

UPDATE ItemDim_DEV
set ActiveFlag = 0,
    EndUTCDate = GETUTCDATE() 
from (select i.SKU, i.itemname, i.category, i.CategoryInternalId, i.itemtype, i.IsActive, i.assetaccount, i.InternalId,
    ni.sku,
    ni.itemname,
    ni.class_name,
    ni.productclass,
    ni.ItemType,
    ni.isactive,
    ni.assetaccount,
    i.CalculatedHash, ni.hashid
    from (
        SELECT i.*
        FROM itemDim_Dev i
        WHERE i.SourceSystem = 'NetSuite'
        --and InternalId = '1692'
    ) i
    CROSS APPLY (
        SELECT (CONVERT([binary](64),hashbytes('SHA2_512',
        concat (ISNULL(im.TargetSKU, ni.sku), ni.itemname, pc.class_name, ni.productclass, ni.ItemType,
        CAST(CASE WHEN ni.IsInactive = 'T' THEN 0 ELSE 1 END AS BIT ), ni.assetaccount)))) hashid,
    ISNULL(im.TargetSKU, ni.sku) sku,
    ni.itemname,
    pc.class_name,
    ni.productclass,
    ni.ItemType,
    CAST(CASE WHEN ni.IsInactive = 'T' THEN 0 ELSE 1 END AS BIT ) isactive, ni.assetaccount
        FROM     NetSuiteInventory ni
        INNER JOIN  Product_Class pc ON ni.productclass = pc.class_id
        LEFT JOIN ItemMapping im ON ni.sku = im.SourceSKU
        WHERE ni.ItemInternalId = CAST(i.InternalId as bigint)
        and
        (CONVERT([binary](64),hashbytes('SHA2_512',
        concat (ISNULL(im.TargetSKU, ni.sku), ni.itemname, pc.class_name, ni.productclass, ni.ItemType,
        CAST(CASE WHEN ni.IsInactive = 'T' THEN 0 ELSE 1 END AS BIT ), ni.assetaccount)))) = i.CalculatedHash
    ) ni
解决方案

你可以直接把CROSS APPLY整合到UPDATE的FROM子句中,无需嵌套多层子查询,这样既简洁又能保证关联逻辑正确,避免不必要的字段投影。以下是修正后的UPDATE语句:

UPDATE id
SET ActiveFlag = 0,
    EndUTCDate = GETUTCDATE()
FROM ItemDim_DEV id
CROSS APPLY (
    SELECT 
        CONVERT([binary](64),HASHBYTES('SHA2_512',
        CONCAT(ISNULL(im.TargetSKU, ni.sku), ni.itemname, pc.class_name, ni.productclass, ni.ItemType,
        CAST(CASE WHEN ni.IsInactive = 'T' THEN 0 ELSE 1 END AS BIT), ni.assetaccount))) AS hashid
    FROM NetSuiteInventory ni
    INNER JOIN Product_Class pc ON ni.productclass = pc.class_id
    LEFT JOIN ItemMapping im ON ni.sku = im.SourceSKU
    WHERE ni.ItemInternalId = CAST(id.InternalId AS BIGINT)
      AND CONVERT([binary](64),HASHBYTES('SHA2_512',
        CONCAT(ISNULL(im.TargetSKU, ni.sku), ni.itemname, pc.class_name, ni.productclass, ni.ItemType,
        CAST(CASE WHEN ni.IsInactive = 'T' THEN 0 ELSE 1 END AS BIT), ni.assetaccount))) = id.CalculatedHash
) ni
WHERE id.SourceSystem = 'NetSuite'

关键说明

  • 直接给要更新的ItemDim_DEV表起别名id,在FROM子句后直接关联CROSS APPLY,逻辑更清晰
  • 保留原有的CROSS APPLY筛选逻辑,确保只更新那些在NetSuiteInventory中存在匹配哈希值的记录
  • 将原嵌套子查询中的SourceSystem = 'NetSuite'条件移到最外层WHERE子句,执行效率更高
  • 不需要投影多余字段,CROSS APPLY只需要保证关联条件成立即可,无需返回无关字段

内容的提问来源于stack exchange,提问作者CreandoMentes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 08:01:35