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具有相同的参数时是否可以循环查询