Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在同一个表上动态相交select查询_Sql_Postgresql - Fatal编程技术网

Sql 在同一个表上动态相交select查询

Sql 在同一个表上动态相交select查询,sql,postgresql,Sql,Postgresql,将我的访问表设置为以下格式 ID access value 1 18 ab 1 32 bc 1 48 cd 2 18 ef 3 18 ab 3 32 bc 我需要根据输入获取所有能够访问特定号码的id 如果输入是[{access:18,value:ab},{access:32,value:bc}] select id from access where access = 18 and value ='ab

将我的访问表设置为以下格式

ID  access value
1   18      ab
1   32      bc
1   48      cd
2   18      ef
3   18      ab  
3   32      bc
我需要根据输入获取所有能够访问特定号码的id

如果输入是
[{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


如何以更好的方式编写上述查询,以便基于输入我可以获得所需的结果。

您的方法很好。另一种方法是:

select id
from access
where access in (18, 32, 38)
group by id
having count(*) = 3;

你的方法很好。另一种方法是:

select id
from access
where access in (18, 32, 38)
group by id
having count(*) = 3;

我认为您正在以json数组的形式传递输入。您可以使用
json\u to\u记录集
将其转换为行,然后与
access
表进行联接,并将计数与
具有的
进行比较,以获得交点

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')
;
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 |
查询1

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')
;
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 |

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')
;
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 |

我认为您正在以json数组的形式传递输入。您可以使用
json\u to\u记录集
将其转换为行,然后与
access
表进行联接,并将计数与
具有的
进行比较,以获得交点

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')
;
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 |
查询1

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')
;
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 |

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')
;
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 |

用你正在使用的数据库标记你的问题。用你正在使用的数据库标记你的问题。我已经添加了其他信息,当select具有相同的参数时是否可以循环查询我已经添加了其他信息,当select具有相同的参数时是否可以循环查询