У меня есть таблица tablename со столбцами col1-col10. Не в каждой строке заполнен столбец col4, но в каждой строке заполнены столбцы col1, col2, col3. Я хочу получить все кортежи {col1, col2, col3}, когда col4 удовлетворяет условию, а затем получить все строки, соответствующие кортежу {col1, col2, col3} из tablename.

У меня есть этот запрос:

select t.*
from mytable t
where exists (
    select 1
    from mytable t1
    where 
        t1.col1 = t.col1 
        and t1.col2 = t.col2 
        and t1.col3 = t.col3 
        and t1.col4 >= 1000
)
LIMIT 1000

Размер таблицы очень велик, поэтому мне нужно добавить ограничение . Из-за ограничения для некоторых {col1, col2, col3} не все строки в результирующем наборе данных. Затем я хочу получить все строки, соответствующие кортежу {col1, col2, col3} из tablename.

Я не возражаю против того, чтобы в моем результате было меньше {col1, col2, col3} кортежей, но мне нужна полная информация о тех, которые у меня есть.

Как я могу этого достичь?

1
user1745995 2 Сен 2020 в 23:50

2 ответа

Лучший ответ

Вы не указываете, какая база данных, но следующий запрос должен выполняться быстрее. Ты можешь сделать:

select t.*
from t
join (
  select distinct col1, col2, col3 
  from t
  where col4 >= 1000
  limit 100
) x on t.col1 = x.col1 and t.col2 = x.col2 and t.col3 = x.col3;

Со следующими индексами запрос должен стать быстрее:

create index ix1 on t (col4, col1, col2, col3);

create index ix2 on t (col1, col2, col3);
1
The Impaler 2 Сен 2020 в 21:38

Гораздо более эффективный подход - использовать оконные функции:

select t.*
from (select t.*,
             sum(case when col4 > 1000 then 1 else 0 end) over (partition by col1, col2, col3) as cnt_matches
      from mytable t
     ) t
where cnt_matches > 0;
0
Gordon Linoff 2 Сен 2020 в 21:59