使用sql从具有冲突字段的列表中删除某个人

时间:2013-04-25 14:19:47

标签: sql db2

嗨,我有一张桌子,要求一个人回答是/否,但是有些人说过是和否,即:

person--------------status
1-------------------yes
2-------------------yes
3-------------------yes
3-------------------no
4-------------------no
5-------------------yes
5-------------------no

第3和第5人有两排,一排为“是”,一组为“否”。

我想找到具有两个答案的人,并删除显示“否”的行。所以我最终得到:

person--------------status
1-------------------yes
2-------------------yes
3-------------------yes
4-------------------no
5-------------------yes

我的逻辑让我失望,我只能得到:

delete from table where status = 'no'
and where person in (select person from table where status = 'yes')

但当然这会删除这两种类型。

有人有什么建议吗?

4 个答案:

答案 0 :(得分:2)

表达式and where不是SQL。试试这个:

delete from table
     where status = 'no' and
           person in (select person from table where status = 'yes')

逻辑对我来说是正确的。

答案 1 :(得分:1)

嗯,这是一种方式(还有其他方式)。

delete from table 
where status = 'no' and
      person in (select person from table 
                 where status in ('no', 'yes')
                 group by person 
                 having count(distinct status)>1)

答案 2 :(得分:1)

编辑:你的解决方案应该有效,除了多余的“where”。

答案 3 :(得分:1)

一旦您修复了额外where的语法错误,它就会删除两者。它表示删除where status ='no' AND 其他条件为真。两者都必须为true才能删除记录。如果记录为“是”,那么显然条件不能同时适用于该记录,因为其中一个记录是错误的。

让我们在DB2中尝试这个:

create table survey 
  (person smallint
  ,answer   varchar(5)
  );

insert into survey
  values (1, 'yes'),
         (2, 'yes'),
         (3, 'yes'),
         (3, 'no'),
         (4, 'no'),
         (5, 'yes'),
         (5, 'no');

这给了我

person  answer
------  ------
  1     yes 
  2     yes 
  3     yes 
  3     no  
  4     no  
  5     yes 
  5     no  

所以,现在测试

delete from survey 
  where answer = 'no'
    and person in (select person 
                     from survey 
                     where answer = 'yes'
                  );

我的桌子现在有

person  answer
------  ------
  1     yes 
  2     yes 
  3     yes 
  4     no  
  5     yes 

显然删除了这两种类型,并且具有所需的结果。

我正在使用DB2 for i 7.1,也许其他人正在使用DB2 LUW。但我发现很难想象基本SQL如何工作的基本逻辑(例如AND)在不同的IBM平台上可能会有很大的不同。