嗨,我有一张桌子,要求一个人回答是/否,但是有些人说过是和否,即:
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')
但当然这会删除这两种类型。
有人有什么建议吗?
答案 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平台上可能会有很大的不同。