I've seen similarly worded questions, and I may be phrasing it wrong, but take the following example table:
a | b |
---|---|
1 | 5 |
2 | 6 |
3 | 7 |
1 | 8 |
2 | 8 |
2 | 9 |
1 | 10 |
2 | 10 |
3 | 10 |
And say I know beforehand that I have a
values [1,2]
. How can I get all values of b
that the a
values share? In the above, the result would be [8, 10]
. If I had [1,3]
for a
, then I would get [10]
. If I had [2]
for a
, I would get [6,8,9,10]
I imagine it would start something like SELECT b from tablename WHERE ...
CodePudding user response:
You can use intersect
Schema and insert statements:
create table test(a int, b int);
insert into test values(1, 5);
insert into test values(2, 6);
insert into test values(3, 7);
insert into test values(1, 8);
insert into test values(2, 8);
insert into test values(2, 9);
insert into test values(1, 10);
insert into test values(2, 10);
insert into test values(3, 10);
Query1: select b from test where a=1 intersect select b from test where a=2
Output:
b |
---|
8 |
10 |
Query2:
select b from test where a=1
intersect
select b from test where a=3
Output:
b |
---|
10 |
Query3:
select b from test where a=2
Output:
b |
---|
6 |
8 |
9 |
10 |
db<>fiddle here
CodePudding user response:
Create a CTE that returns the values of a
that you want and filter the table for these values only.
Then group by b
and in the HAVING
filter the resultset so that only values of b
that are associated to the values of a
that you want are returned:
WITH cte(a) AS (VALUES (1), (2))
SELECT b
FROM tablename
WHERE a IN cte
GROUP BY b
HAVING COUNT(*) = (SELECT COUNT(*) FROM cte);
See the demo.