SQLite query - имя фильтра, где каждый связанный идентификатор содержится в наборе идентификаторов. - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь обработать запрос, который найдет мне все различные Names, чьи LocationIDs находятся в заданном наборе идентификаторов.Подвох заключается в том, что если какой-либо из LocationIDs, связанных с отдельным Name, отсутствует в наборе, то Name не должно быть в результатах.

Скажем, у меня есть следующая таблица:

ID | LocationID | ... | Name
-----------------------------
1  |  1         | ... | A
2  |  1         | ... | B
3  |  2         | ... | B

Мне нужен запрос, похожий на

SELECT DISTINCT Name FROM table WHERE LocationID IN (1, 2);

Проблема с вышесказанным в том, что он просто проверяет, равен ли LocationID 1 ИЛИ 2, это вернет следующее:

A
B

Но мне нужно, чтобы он вернулся:

B

Поскольку B - единственный Name, где оба его LocationIDs находятся в наборе (1, 2)

Ответы [ 2 ]

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

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

SELECT Name
FROM table
WHERE LocationID IN (1, 2)
GROUP BY Name
HAVING COUNT(*) = 2;

Если можно дублировать пары Name / LocationID, используйте HAVING COUNT(DISTINCT LocationID) = 2.

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

Вы можете попробовать написать два подзапроса.

  1. получить count по каждому Name
  2. получите count от вашего состояния.

затем join их по количеству, что означает, что вам нужно, чтобы все соответствовали количеству ваших условий.

Схема (SQLite v3.17)

CREATE TABLE T(
   ID int,
   LocationID int,
   Name varchar(5)

);

INSERT INTO T VALUES (1, 1,'A');
INSERT INTO T VALUES (2, 1,'B');
INSERT INTO T VALUES (3, 2,'B');

Запрос № 1

SELECT t2.Name
FROM 
(
    SELECT COUNT(DISTINCT LocationID) cnt
    FROM T
    WHERE LocationID IN (1, 2)
) t1
JOIN 
(
    SELECT COUNT(DISTINCT LocationID) cnt,Name
    FROM T
    WHERE LocationID IN (1, 2)
    GROUP BY Name
) t2 on t1.cnt = t2.cnt;

| Name |
| ---- |
| B    |

Просмотр на БД Fiddle

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