2016-04-13 25 views
0

我正在努力争取一点SQL查询。我们有一些地址的START日期错误,但CREATE日期正确。使用不同的值更新多行 - THEN语句

目标是更新大约4000条记录,而不是一个接一个。我知道我可以根据Person_ID做到这一点,但这会非常耗时。 Then语句的问题是因为我必须选择同一行中的值,所以我可能需要首先声明一个值,但我不确定如何适应它?

update ADDRESS 
set START_DATE = CASE 
    when STATUS = 'Inactive' and START_DATE = '1900-01-01' 
    then (select CREATE_DATE from ADDRESS where STATUS = 'Inactive' and START_DATE = '1900-01-01') 
    else END_DATE end 
where STATUS = 'Inactive' and START_DATE = '1900-01-01' and PEOPLE_ID IN (select PEOPLE_ID from ADDRESS where START_DATE = '1900-01-01' and STATUS = 'Inactive') 

我知道某些行的语句可能是多余的。 PEOPLE_ID应该可能以某种方式适合THEN声明的Select Statement权利?

+0

是你的目标只是为启动日期错误的非活动记录更新'start_date'到'create_date'? – Quassnoi

+0

@Quassnoi - 是的。在3个不同的地方发生相同的过滤,并且不需要在WHERE子句中尝试使用PEOPLE_ID。只需查找START_DATE ='1900-01-01'和STATUS ='非活动',然后执行您的答案。即使有其他,如果它是正确设置的值,您也不希望将START_DATE设置为END_DATE。 – Dresden

+0

@Quassnoi是的,这正是我想要做的!查询在我的测试数据库中工作。非常感谢! – Nestalna

回答

2
UPDATE address 
SET  start_date = create_date 
WHERE status = 'inactive' 
     AND start_date = '1900-01-01' 
0
update ADDRESS 
set START_DATE = CASE when STATUS = 'Inactive' and START_DATE = '1900-01-01' 
          then (select CREATE_DATE 
            from ADDRESS 
            where STATUS = 'Inactive' 
            and START_DATE = '1900-01-01') 
         else END_DATE 
       end 
where STATUS = 'Inactive' and START_DATE = '1900-01-01' 
    and PEOPLE_ID IN (select PEOPLE_ID 
         from ADDRESS 
        where START_DATE = '1900-01-01'and STATUS = 'Inactive') 

上面是您的更新 - 刚刚格式化
这个搞砸了这么多的水平,你必须:

where STATUS = 'Inactive' and START_DATE = '1900-01-01' 

不同的时间 和四个时间是不同的,但本身就很奇怪

CASE when STATUS = 'Inactive' and START_DATE = '1900-01-01' 

总是锣是真实的,因为这是在哪里

这并没有什么,你已经拥有它在哪里

and PEOPLE_ID IN (select PEOPLE_ID 
          from ADDRESS 
         where START_DATE = '1900-01-01'and STATUS = 'Inactive') 

这个返回多发性值到一个更新

then (select CREATE_DATE 
     from ADDRESS 
     where STATUS = 'Inactive' 
     and START_DATE = '1900-01-01')