带有 WHERE EXISTS 的 SQL UPDATE 语句

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/9023879/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-01 14:09:10  来源:igfitidea点击:

SQL UPDATE statement with WHERE EXISTS

sqlsql-server

提问by user1152145

Im trying to write a query that updates a date only if the group im updating has a LINE_CD of 50. Would i do it like this?

我正在尝试编写一个查询,仅当我更新的组的 LINE_CD 为 50 时才更新日期。我会这样做吗?

UPDATE EMPLOYER_ADDL  
SET EMPLOYER_ADDL.GTL_UW_APPRV_DT = EMPLOYER_ADDL.DNTL_UW_APPRV_DT 
WHERE EXISTS
    ( 
      SELECT EMP_PLAN_LINE_INFO.LINE_CD
      FROM EMP_PLAN_LINE_INFO
      Where EMP_PLAN_LINE_INFO.GR_NBR = EMPLOYER_ADDL.GR_NBR and
       EMP_PLAN_LINE_INFO.LINE_CD = 50
     )

采纳答案by xbrady

What about this?

那这个呢?

UPDATE ea  
SET ea.GTL_UW_APPRV_DT = ea.DNTL_UW_APPRV_DT 
FROM EMPLOYER_ADDL ea
    INNER JOIN EMP_PLAN_LINE_INFO ei ON(ei.GR_NBR = ea.GR_NBR)
WHERE 
ei.LINE_CD = 50

回答by Aaron Bertrand

UPDATE ea
  SET GTL_UW_APPRV_DT = DNTL_UW_APPRV_DT
  FROM EMPLOYER_ADDL AS ea
  WHERE EXISTS
  (
    SELECT 1
      FROM EMP_PLAN_LINE_INFO AS ep
      WHERE ep.GR_NBR = ea.GR_NBR
      AND ep.LINE_CD = 50
  );

However, if you can derive this information from a query, why update the table? Seems like this will have to be run constantly else risk being out of date.

但是,如果您可以从查询中获得此信息,为什么要更新表?似乎这必须不断运行,否则可能会过时。

回答by AJP

I believe this will give you same result.

我相信这会给你同样的结果。

UPDATE ea
  SET GTL_UW_APPRV_DT = DNTL_UW_APPRV_DT
  FROM EMPLOYER_ADDL AS ea
  INNER JOIN EMP_PLAN_LINE_INFO AS ep
      ON ep.GR_NBR = ea.GR_NBR
      AND ep.LINE_CD = 50

回答by SQLMason

Assuming that GR_NBR is a PK and distinct in EMP_Plan_line_Info:

假设 GR_NBR 是一个 PK 并且在 EMP_Plan_line_Info 中是不同的:

UPDATE  EA
SET     GTL_UW_APPRV_DT = DNTL_UW_APPRV_DT
FROM    EMPLOYER_ADDL EA
        INNER JOIN EMP_PLAN_LINE_INFO EP
            ON EP.GR_NBR = EA.GR_NBR
               AND EP.LINE_CD = 50

回答by Pankaj

Try with this also. I think this is new for you ?

也试试这个。我认为这对你来说是新的?

UPDATE ADDL   
SET ADDL.GTL_UW_APPRV_DT = ADDL.DNTL_UW_APPRV_DT 
From EMPLOYER_ADDL ADDL
Inner Join  EMP_PLAN_LINE_INFO INFO on INFO.GR_NBR = ADDL.GR_NBR
Where INFO.LINE_CD = 50

回答by Brain2000

I believe exists requires a wildcard:

我相信存在需要通配符:

UPDATE EMPLOYER_ADDL  
SET EMPLOYER_ADDL.GTL_UW_APPRV_DT = EMPLOYER_ADDL.DNTL_UW_APPRV_DT 
WHERE EXISTS
    ( 
      SELECT *
      FROM EMP_PLAN_LINE_INFO
      Where EMP_PLAN_LINE_INFO.GR_NBR = EMPLOYER_ADDL.GR_NBR and
       EMP_PLAN_LINE_INFO.LINE_CD = 50
     )

I prefer using IN though. Some argue that it can be slower, but I have found the SQL optimizer in 2005 and higher make IN work the same as EXISTS if the field is a non-null field.

不过我更喜欢使用 IN。有些人认为它可能会更慢,但我发现 2005 年及更高版本的 SQL 优化器使 IN 的工作与 EXISTS 相同,如果该字段是非空字段。

UPDATE EMPLOYER_ADDL  
SET EMPLOYER_ADDL.GTL_UW_APPRV_DT = EMPLOYER_ADDL.DNTL_UW_APPRV_DT 
WHERE EMPLOYER_ADDL.GR_NBR IN
    ( 
      SELECT EMP_PLAN_LINE_INFO.GR_NBR
      FROM EMP_PLAN_LINE_INFO
      Where EMP_PLAN_LINE_INFO.LINE_CD = 50
     )