如果我有一个非常简单的表:
id outcome position
-- ------- --------
1 TRUE 01
2 TRUE 01
2 FALSE 01
2 TRUE 02
其中id和position可以匹配多个记录;在这种情况下,我只想选择FALSE结果,即当多个记录中出现相同的id和位置时。例如id = 1只有1条记录,所以TRUE或FALSE就好了。最后一条记录的id = 2(与第2和第3条记录相同),但是position = 02,所以也可以是TRUE或FALSE。但是因为记录2和3都共享相同的id和位置,我只想选择具有错误结果的记录。这应该是结果:c
id outcome position
-- ------- --------
1 TRUE 01
2 FALSE 01
2 TRUE 02
我该怎么做?我知道我可以创建一个表然后执行类似
的操作delete from mytable
where exists
(select a.* from mytable a
join mytable b
on a.id = b.id and a.position = b.position
where a.outcome = TRUE)
但我宁愿避免创建表并删除记录。我宁愿只想在第一个实例中选择我想要的记录。
答案 0 :(得分:2)
要为id
/ position
列的每个唯一组合仅获取一个输出行,请对这些列使用分组。
要确定FALSE值的优先级,只需获取组中的最小值:
SELECT id,
min(outcome) AS outcome,
position
FROM MyTable
GROUP BY id, position;
答案 1 :(得分:1)
试试这个
SELECT *
FROM Yourtable a
WHERE NOT EXISTS (SELECT 1
FROM Yourtable b
WHERE a.id = b.id
AND a.position = b.position
AND a.outcome > b.outcome)
按字母顺序排序FALSE
将在TRUE
之前订购。因此,当特定FALSE
和“位置组合”{/ 1}同时存在TRUE
和FALSE
时,将仅返回id
条记录
答案 2 :(得分:0)
您似乎想要select
。像这样:
select t.*
from mytable t
where outcome = FALSE or (id = position);
我并不完全遵循您真正想要的规则。
您可以将其放入视图中,这样您就可以像访问表一样访问所需的结果:
create view myview as
select t.*
from mytable t
where outcome = FALSE or (id = position);