【问题标题】:SQL Update Query With Specific Conditions具有特定条件的 SQL 更新查询
【发布时间】:2014-07-07 10:00:54
【问题描述】:

我使用的是 Oracle 11g 数据库并且有两个表:

EMP

ID  EMPNO   AGE DATE_PUBLISHED

1   1001    11  14/01/1999

2   1002    22  14/01/1999

3   1003    33  14/01/1999

4   1004    44  14/01/1999

5   1005    55  14/01/1999

6   1006    66  14/01/1999

EMP_MIRROR

ID  EMPNO   AGE DATE_PUBLISHED

1   1001    11  05/01/2004

2   1123    54  05/01/2004

3   1003    87  05/01/2004

4   1004    65  05/01/2004

5   1545    78  05/01/2004

6   1006    14  05/01/2004

我想根据以下条件更新EMP_MIRROR 表的DATE_PUBLISHED 列:

如果对于两个表中的任何ID,EMPNO 或AGE 的值存在差异,则应将EMP_MIRROR 的DATE_PUBLISHED 列更新为SYSDATE。

EMP_MIRROR (after updation)

ID  EMPNO   AGE DATE_PUBLISHED

1   1001    11  05/01/2004

2   1123    54  07/07/2014

3   1003    87  07/07/2014

4   1004    65  07/07/2014

5   1545    78  07/07/2014

6   1006    14  07/07/2014

结果集说明:

ID: 1 (EMPNO and AGE are same in both the tables, hence DATE_PUBLISHED is not updated)

ID: 2 (EMPNO and AGE are different in both the tables, hence DATE_PUBLISHED is updated)

ID: 3 (AGE is different in both the tables, hence DATE_PUBLISHED is updated)

ID: 4 (AGE is different in both the tables, hence DATE_PUBLISHED is updated)

ID: 5 (EMPNO and AGE are different in both the tables, hence DATE_PUBLISHED is updated)

ID: 6 (AGE is different in both the tables, hence DATE_PUBLISHED is updated)

请提出一个可以达到此结果的查询。

【问题讨论】:

  • 你使用的是哪个数据库?
  • 鉴于您引用的是 SYSDATE,我假设是 oracle,请添加此标签。

标签: sql oracle11g


【解决方案1】:
UPDATE emp_mirror
SET    date_published = SYSDATE
WHERE EXISTS (SELECT 1
              FROM   emp
              WHERE  emp.id = emp_mirror.id
              AND  ((emp.age != emp_mirror.age OR)
                    (emp.empno != emp_mirror.empno)));

【讨论】:

    【解决方案2】:
    with temp as(
    select [ID]
           ,[DATE_PUBLISHED]
    
    from [EMP_MIRROR]
    inner join [EMP] on [EMP_MIRROR].[ID] = [EMP].[ID]
    
    where [EMP_MIRROR].[DATE_PUBLISHED] <> [EMP].[DATE_PUBLISHED]
    )
    
    update [EMP_MIRROR] set [DATE_PUBLISHED] = GETDATE() where ID = (Select [ID] from temp)
    

    可能有更好的方法来执行此操作,但如果您要比较两个表,然后将日期不匹配的 ID 选择到临时表中,则在新的 ID 列表上使用更新。

    仅供参考,我还没有检查此语句是否有效,但它的要点在那里,我会在有时间测试时更新它。

    【讨论】:

    • 检查现在发布的答案,GarethD 的解决方案效率更高:)
    【解决方案3】:

    标准的 SQL 解决方案(因为没有指定 DBMS)是:

    UPDATE  EMP_MIRROR
    SET     DATE_PUBLISHED = CURRENT_TIMESTAMP
    WHERE   EXISTS
            (   SELECT  1 
                FROM    EMP
                WHERE   EMP.ID = EMP_MIRROR.ID
                AND (   EMP.AGE <> EMP_MIRROR.AGE
                    OR  EMP.EMPNO <> EMP_MIRROR.EMPNO
                    )
            );
    

    Example on SQL Fiddle

    【讨论】:

      【解决方案4】:

      可能是这样的

      With CTE AS 
      (
       SELECT EM.* FROM EMP_MIRROR EM JOIN EMP E ON E.ID = EM.ID
       WHERE EM.AGE <> E.AGE OR E.EMPNO <> EM.EMPNO 
      )
      Update EMP_MIRROR EE SET DATE_PUBLISHED = CURRENT_TIMESTAMP
      FROM CTE JOIN EMP_MIRROR ON CTE.EMPNO = EE.EMPNO 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-14
        • 2022-11-17
        • 2020-06-03
        相关资源
        最近更新 更多