I need a bit of logical help in writing a query.
Here is the set up.
create table main_table
(
id varchar(10) not null,
seq varchar(10) not null
)
insert into main_table (id, seq)
values ('A1', '1'), ('A1', '2'),
('A1', '3'), ('A2', '1'),
('A2', '2'), ('A2', '3'),
('A3', '1'), ('A3', '2'),
('A3', '3');
go
create table sub_table
(
id varchar(10) not null,
seq varchar(10) not null
)
insert into sub_table (id, seq)
values ('A1', '1'), ('A1', '2'), ('A2', '1');
I need a query that returns all records from main_table where the id of main_table matches the id of sub_table, but seq of main_table does not match seq of sub_table.
Expected result is
| id | seq |
|---|---|
| A1 | 3 |
| A2 | 2 |
| A2 | 3 |
My attempt
select
a.id, a.seq
from
main_table a
where
exists (select 1 from sub_table b
where a.id = b.id and a.seq != b.seq)
What is the right query to do this?
Advertisement
Answer
Here’s one way (Fiddle)
SELECT a.id,
a.seq
FROM main_table a
JOIN sub_table b
ON a.id = b.id
GROUP BY a.id,
a.seq
HAVING MAX(CASE WHEN a.seq = b.seq THEN 1 ELSE 0 END) = 0
Or
SELECT a.id,
a.seq
FROM main_table a
WHERE a.id IN (SELECT b.id
FROM sub_table b)
AND NOT EXISTS (SELECT 1
FROM sub_table b
WHERE a.id = b.id
AND a.seq = b.seq)