2014-07-07 50 views
0

我使用Oracle 11g数据库,并有两个表:SQL更新查询具体情况

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 

我想更新DATE_PUBLISHED专栏基于以下条件210表:

如果在两个表的任何ID,存在的EMPNOAGE的值的差,那么EMP_MIRRORDATE_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) 

请建议的查询可以达到这个效果。

+0

的数据库您使用像这样的东西? –

+0

鉴于你引用SYSDATE,我假设oracle,请添加此标签。 –

+0

Oracle 11g数据库 –

回答

0

这个标准的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

0
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))); 
0
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列表上使用更新。

只是供参考,我还没有检查过这个声明是否有效,但它的要点在那里,当我有时间测试时我会更新它。

+0

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

0

可能

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