Есть ли более эффективный способ выбора данных, чем множественные пересечения SQL - PullRequest
0 голосов
/ 21 января 2020

У меня есть данные в моей PostgreSQL базе данных в формате ниже

answer_id    question_id    country_id    answer
    1             1              1           7
    2             1              2           7
    3             1              3           5
    4             2              1           3
    5             2              2           2    
    6             2              3           2  

Я пытаюсь получить все страны, которые имеют определенный ответ для определенной страны, и мы можем иметь несколько комбинация вопрос-ответ. Например, мне могут понадобиться все страны, у которых для вопроса 1 есть 7 для ответа (2 значения), но затем, наряду с первым условием), я также добавляю, что ответ на вопрос 2 равен 2, и теперь он падает с 2 значений (страны под идентификаторы 1 и 2) только к 1 (идентификатор страны 2).

Теперь Мне удалось сделать это с помощью пересечения следующим образом ...

select country_id from answer_table where question_id = 1 and answer = 7
intersect 
select country_id from answer_table where question_id = 2 and answer = 2

Проблема заключается в том, что мне нужно иметь возможность делать это динамически, что означает, что один раз я могу выбрать только 1 пару вопросов и ответов, но в других случаях мне может понадобиться больше (3, 5, 7 или что-то еще), что влияет на количество выборок (и, в свою очередь, пересекается).

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

Поэтому мой вопрос в основном заключается в том, существует ли более эффективный или более умный способ динамического выбора / пересечения (например, функция, которая принимает массивы данных или tever?)?

Спасибо и хорошего вам!

ps Я нашел этот поток стека, но там они всегда используют фиксированные 5 запросов.

1 Ответ

1 голос
/ 21 января 2020

Я не знаю, является ли он более эффективным, но вы можете найти его более обобщенным:

select country_id from answer_table
where (question_id, answer) in ( (1, 7), (2, 2) )
group by country_id
having count(distinct (question_id, answer) ) = 2;

Вы можете заменить список in и "2" на функции массива для передачи в значения массива.

...