2016-07-04 4 views
0

im довольно новый для SQLite, поэтому задает этот вопрос!SQLite удаляет строки на основе нескольких столбцов

Мне нужно удалить строки в таблице, чтобы у меня было самое раннее появление столбца каждого уникального значения в столбце X (цвет) на основе столбца Y (время).

В принципе у меня есть это:

тест | цвет | время (ы)
1 | Желтый | 8
1 | Красный | 6
1 | Желтый | 10
два | Красный | 4

Что я хочу, чтобы удалить строки, так что это выглядит следующим образом:

тест | цвет | время (ы)
1 | Желтый | 8
два | Красный | 4

Заранее спасибо!

РЕДАКТИРОВАТЬ: Чтобы быть яснее, мне нужно сохранить самое раннее происхождение во времени, когда каждый цвет произошел независимо от теста.

EDIT: Я могу выбрать строки я хочу, чтобы при этом:

выберите * от (выберите * от COL_TABLE порядка по времени по алфавиту) х группы по цвету;

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

EDIT: Следующие обработанная благодаря @JimmyB:

DELETE FROM COL_TABLE WHERE EXISTS (SELECT * FROM COL_TABLE t2 WHERE  COL_TABLE .colour = t2.colour AND COL_TABLE .test = t2.test AND COL_TABLE .time < t2.time) 
+0

И как определить первую запись? –

+0

@juergend 'MIN (время)' похоже. – JimmyB

+2

'DELETE FROM my_table WHERE EXISTS (SELECT 1 FROM my_table t2 WHERE my_table.colour = t2.colour AND my_table.test = t2.test И my_table.time JimmyB

ответ

2

Вы можете включать подзапросы (EXISTS/NOT EXISTS) в предложении о наличии DELETE заявления WHERE.

Как и подзапросы в SELECT, они могут ссылаться на таблицу во внешнем выражении для создания совпадений.

В вашем случае, попробуйте следующее:

DELETE FROM my_table 
WHERE EXISTS (
    SELECT * 
    FROM my_table t2 
    WHERE my_table.colour = t2.colour 
    AND my_table.test = t2.test 
    AND my_table.time < t2.time 
) 

Это утверждение использует три примечательных конструкцию:

  • подзапросы в DELETE
  • автообъединение
  • эмуляции MIN(...) через себя -join

Подзапрос с EXISTS указан выше.

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

Как правило, вы должны использовать функцию MIN(...), чтобы найти минимум. Минимум можно определить как единственное значение, для которого нет значения ниже, и вот что мы здесь используем, потому что нас фактически не интересует фактическое значение, а только хотят идентифицировать запись , которая содержит это значение ,

(Так как мы удаление, наш SELECT дает все не являющихся -минимума строки, которые мы хотим удалить, чтобы сохранить только минимумы.)

Итак, что говорится в заявлении является:

Удалить все записи от my_table, по которым имеется не менее одной записи в my_table с тем же colour и тем же test, но .

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