sqlite - 在某个列中存在两个具有不同值的记录,只选择某个记录

时间:2016-12-06 12:15:37

标签: sql sqlite

如果我有一个非常简单的表:

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)

但我宁愿避免创建表并删除记录。我宁愿只想在第一个实例中选择我想要的记录。

3 个答案:

答案 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}同时存在TRUEFALSE时,将仅返回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);
相关问题