динамически пересекаются запросы выбора на одной и той же таблице - PullRequest
0 голосов
/ 28 апреля 2018

Моя таблица доступа в следующем формате.

ID  access value
1   18      ab
1   32      bc
1   48      cd
2   18      ef
3   18      ab  
3   32      bc

Мне нужно получить все идентификаторы, которые имеют доступ к определенным номерам на основе ввода.

Если ввод [{access:18,value:ab},{access:32, value:bc}]

select id from access where access = 18 and value ='ab'
intersect
select id from access where access = 32 and value = 'bc'

Выход 1,3

Если ввод [{access:18,value:ab},{access:32, value:bc},{access:48,value:cd}]

select id from access where access = 18 and value ='ab'
intersect
select id from access where access = 32 and value ='bc'
intersect
select id from access where access = 48 and value ='cd'

вывод равен 1.

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

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

Я думаю, что вы передаете входные данные в виде массива json. Вы можете использовать json_to_recordset, чтобы преобразовать его в строки, а затем выполнить соединение с таблицей access и сравнить счет с HAVING, чтобы получить пересечение.

SQL Fiddle

Настройка схемы PostgreSQL 9.6 :

CREATE TABLE access
    (ID int, access int, value varchar(2))
;

INSERT INTO access
    (ID, access, value)
VALUES
    (1, 18, 'ab'),
    (1, 32, 'bc'),
    (1, 48, 'cd'),
    (2, 18, 'ef'),
    (3, 18, 'ab'),
    (3, 32, 'bc')
;

Запрос 1 :

SELECT  ID
FROM access a
INNER JOIN (
    SELECT *, COUNT(*) OVER () as ct
    FROM json_to_recordset('[{"access":18,"value":"ab"},{"access":32, "value":"bc"}
                            ,{"access":48,"value":"cd"}
                            ]'
                          ) 
        AS j("access" INT, "value" TEXT)
    ) j ON (
        j.access = a.access
        AND j.value = a.value
        ) GROUP BY ID HAVING COUNT(*) = MAX(ct)

Результаты

| id |
|----|
|  1 |
0 голосов
/ 28 апреля 2018

Ваш метод в порядке. Другой метод:

select id
from access
where access in (18, 32, 38)
group by id
having count(*) = 3;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...