SQL选择跨越整个属性范围的项目

时间:2013-04-22 19:30:24

标签: sql select jdbc toggle derby

标题可能听起来有点不清楚,希望我的描述会更清晰! 这是我想要做的。我有一个包含3列,id,value和二进制属性的表。我想从表中选择具有相同名称但反对二进制属性的项目,例如

ID|Value     |Toggle
====================
0 |noun      |no
1 |verb      |no
2 |noun      |yes
3 |adjective |yes
4 |article   |no
5 |noun      |no
6 |adjective |yes
7 |verb      |no
8 |article   |yes

在此表上,返回的记录为

ID|Value     |Toggle
====================
0 |noun      |no
2 |noun      |yes
4 |article   |no
5 |noun      |no
8 |article   |yes

将返回所有名词记录和所有文章记录,因为存在没有和是的名词记录,以及没有和是的文章记录。

不会返回

形容词,因为两个记录都有一个切换为yes,并且不会返回动词,因为两个记录都有一个切换为no。谢谢阅读!

如果我的描述仍然不明确,请告诉我任何后续问题。如果重要的话,我正在使用Derby和JDBC。

3 个答案:

答案 0 :(得分:2)

这可能对你有用,我很想知道这会有多快/慢(如果你有一个tog的索引,它会非常快)....我假设表名是t和列值为val,列切换为tog:)

SELECT * FROM T 
WHERE  tog = 'yes' and val in (select val from t where tog='no')

UNION 

SELECT * FROM T 
WHERE  tog = 'no'  and val in (select val from t where tog='yes')

答案 1 :(得分:1)

请试试这个:

select * from table a
where exists (
select 1 from table b
where a.Value = b.Value
and a.ID != b.ID
and a.Toggle != b.Toggle
)

答案 2 :(得分:1)

select distinct a.* from my_table a
  join my_table b on a.Value = b.Value and a.Toggle != b.Toggle