2016-12-06 4 views
0

, если у меня есть очень простая таблица:SQLite - где существуют две записей с разным значением в определенном столбце, только выбрать определенную запись

id  outcome position 
--  ------- -------- 
1  TRUE   01 
2  TRUE   01 
2  FALSE   01 
2  TRUE   02 

где и идентификатор и позиции могут матчи через несколько записей; в этом случае я хотел бы выбрать только результат FALSE, т. е. когда один и тот же идентификатор и позиция отображаются в нескольких записях. например, id = 1 имеет только 1 запись, поэтому здесь истинно TRUE или FALSE. Последняя запись имеет id = 2 (так же, как и 2-я и 3-я записи), но позиция = 02, поэтому также верно TRUE или FALSE. однако, поскольку записи 2 и 3 имеют одинаковый идентификатор и позицию, я хочу только выбрать запись с ложным результатом. это должно быть результатом: 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) 

однако я предпочел бы избежать того, чтобы создать таблицу и удаления записей. Я бы предпочел просто выбрать записи, которые я хочу в первом экземпляре.

+2

Я не вижу, как ваши объяснения совпадают с результатами. –

+0

Привет, Гордон - в основном, когда id и позиция одинаковы в двух разных записях, значение FALSE в столбце результатов должно переопределять запись с TRUE значением. Поэтому я бы хотел только выбрать запись, где результат FALSE, учитывая начальное условие. – brucezepplin

+0

Редактировать вопрос, чтобы уточнить – brucezepplin

ответ

2

Чтобы получить только один выходную строку для каждой уникальной комбинации столбцов в id/position, использование группировки над этими колоннами. Чтобы изменить приоритет ЛОЖЬ значение, просто получить наименьшее значение в группе:

SELECT id, 
     min(outcome) AS outcome, 
     position 
FROM MyTable 
GROUP BY id, position; 
+0

спасибо. очень просто - пинал себя за то, что не думал об этом. – brucezepplin

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); 
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 запись будет возвращена, когда есть и TRUE и FALSE для конкретного id и `комбинации положения

Смежные вопросы