2015-10-06 10 views
1

Я пытаюсь выяснить, как получить все строки с идентификатором, имеющим определенное значение в другом столбце.Сравнение строк со значением столбца

База данных выглядит следующим образом:

Database Illustration

Я хочу, чтобы получить те строки, которые имеют VAL 2 и соответствующие строки ID. Так что в данном случае это дало бы мне все строки ID 1 и ID 3 строки:

Database Illustration 2

ответ

2

Один метод существует:

select t.* 
from test t 
where exists (select 1 from test t2 where t2.id = t.id and t2.val = 2); 
3

вам нужно подзапрос (или присоединиться или КТР или производной таблицы) подзапросов является easist визуализировать

Select * из теста, где идентификатор (SELECT ID из теста, где VAL = 2)

1

Конструкции вроде where id in (select id from ...) и where exists (select 1 from ...) могут занимать очень много времени, потому что для каждой строки в test вы выполняете подзапрос. Для того, чтобы решить вашу проблему, то вы можете присоединиться к test с самими собой и сделать distinct так:

SELECT DISTINCT t1.* 
FROM test t1 
    INNER JOIN test t2 ON t1.id = t2.id 
WHERE t2.val = 2 
+1

Почему бы присоединиться быстрее, чем коррелированные подзапросы? База данных по-прежнему должна искать соответствующие идентификаторы для каждого идентификатора, и в этом запросе есть дополнительный этап поиска дубликатов. –

+1

Да, база данных по-прежнему должна искать соответствующие ID для каждого идентификатора, но выполнение подзапроса в where-clause вызывает дополнительные накладные расходы, не так ли? Каждая строка в таблице требует выполнения подзапроса. Простая реализация внутреннего соединения базы данных будет быстрее, чем подзапрос выполнения для каждой строки. Возможно, оптимизатор sqlite настолько умный и оптимизирует эти запросы к идентичным планам выполнения. –

+1

P.S. DISTINCT может быть заменен GROUP BY. И если это так важно, можно присоединиться к таблице с подзапросом, который возвращает идентификаторы с VAL = 2 –

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