【问题标题】:How to update a table based on case condition如何根据案例条件更新表
【发布时间】:2026-02-12 12:05:01
【问题描述】:

我有 4 张桌子。

  • PRIMARY (CASE_ID, ADDRESS, COUNTRY)
  • SECONDARY (CASE_ID, ADDRESS, COUNTRY)
  • DEST (CASE_ID, PRIMARY_ADDRESS, SECONDARY_ADDRESS, PRIMARY_COUNTRY, SECONDARY_COUNTRY)
  • COUNTRIES (COUNTRY, RISK_SCORE)

更新查询:

update d
set d.PRIMARY_ADDRESS= ...?
    ,d.PRIMARY_COUNTRY= ...?
    ,d.SECONDARY_ADDRESS= ...?
    ,d.SECONDARY_COUNTRY= ...?
from DEST d
join PRIMARY p
on p.CASE_ID=d.CASE_ID
join SECONDARY s
on s.CASE_ID=d.CASE_ID
join COUNTRIES c
... ??? 

我必须根据COUNTRIES 表中具有最高risk_score 的地址,将DEST 表的地址和国家列更新为PRIMARYSECONDARY 表的对应列。 Risk_Score 的值从 0 到 100。

CASE_IDCOUNTRY 列可以用作连接列。请帮忙。

【问题讨论】:

  • 尝试使用您想要的内容构建选择。将update d set 替换为select。然后,当您的查询返回您想要的内容时。将查询改回来。您可以在更新中使用几乎所有相同的关键字,就像在选择中一样。在这种情况下,我认为您正在寻找case
  • 您需要加入 COUNTRIES 两次,一次为主要国家,一次为次要国家,分别返回 risk_score 最高的国家。

标签: sql sql-server join sql-update case


【解决方案1】:

这将是您获取数据的基本选择语句。您可以将其用作内部查询并加入目标表并进行更新 -

SELECT * 
FROM 
(SELECT 
  P.CASE_ID, P.ADDRESS PRIM_ADDRESS, P.COUNTRY PRIM_COUNTRY, 
  ROW_NUMBER() OVER (PARTITION BY CASE_ID ORDER BY RISK_SCORE DESC) AS RN_PRIMARY
  FROM [PRIMARY] P JOIN COUNTRIES C
  ON P.COUNTRY = C.COUNTRY)PRIMARYVALUES
JOIN 
(SELECT P.CASE_ID, P.ADDRESS SEC_ADDRESS, P.COUNTRY SEC_COUNTRY, 
  ROW_NUMBER()    OVER (PARTITION BY CASE_ID ORDER BY RISK_SCORE DESC) AS RN_SECONDARY
  FROM [SECONDARY] P JOIN COUNTRIES C
  ON P.COUNTRY = C.COUNTRY)SECONDARYVALUES 
 ON PRIMARYVALUES.CASE_ID = SECONDARYVALUES.CASE_ID
WHERE RN_PRIMARY = 1 AND RN_SECONDARY = 1

这是 SQLFiddle - http://sqlfiddle.com/#!3/49642b/2

【讨论】: