SQL-запрос, чтобы получить все отдельные слова в таблице, где связанный идентификатор находится в массиве - PullRequest
0 голосов
/ 08 ноября 2018

Я нахожусь над моей головой с этим SQL-запросом.

Мне нужно получить все отдельные слова в таблице, где element_id находится в массиве.

 word | element_id
------+-----------
 cat  | 1 
 dog  | 1 
 cat  | 2 
 dog  | 2 
 rat  | 1 
 rat  | 3 

Я хотел бы найти все слова, которые имеют element_id 1 и 2.

В этом случае я хотел бы вернуть кошка и собака , но не крыса .

Я пробовал это, но это не работает.

select distinct word from words where element_id = 1 and element_id = 2

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Один вариант будет использовать агрегатные функции avg и sum в операторе выбора grouping, который включает в себя предложение having как:

select word
  from words
 group by word
having avg(nvl(element_id,0)) = 1.5 and sum(nvl(element_id,0)) = 3;

при условии, что element_id - это целочисленный столбец, допускающий значение NULL.

Или

select word
  from words
 group by word
having avg(element_id) = 1.5 and sum(element_id) = 3;

, поскольку element_id - это целочисленный столбец, не имеющий значения NULL.

P.S. Таким образом, нет необходимости записывать идентификаторы явно.

0 голосов
/ 08 ноября 2018

Вы можете использовать group by и having:

select word
from words
where element_id in (1, 2)
group by word
having count(*) = 2;

Предполагается, что в вашей таблице нет повторяющихся строк.

Если производительность является проблемой, тогда:

select w.word
from words w
where w.element_id = 1 and
      exists (select 1 from words w2 where w2.word = w.word and w2.element_id = 2);

Для этого можно использовать индекс для words(word, element_id) и words(element_id) (два отдельных индекса).

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