\i tmp.sql
create table question
(question_id integer not null primary key)
;
INSERT INTO question(question_id) VALUES
( 42) , ( 10) , ( 2) , ( 36) , ( 49) ;
create table question_exclusion
( question_type text
, question_sub_type text
, question_id integer REFERENCES question( question_id)
);
INSERT INTO question_exclusion(question_type, question_sub_type, question_id) VALUES
('A' , 'A_1' , 42 ) , ('A' , 'A_2' , 10 ) , ('B' , 'B_1' , 36 ) , ('C' , null , 2 ) ;
WITH types AS (
select distinct question_type, question_sub_type
FROM question_exclusion
)
SELECT t.question_type, t.question_sub_type, q.question_id
FROM question q
JOIN types t ON NOT EXISTS (
SELECT * FROM question_exclusion x
WHERE 1=1
AND x.question_id = q.question_id
AND x.question_type = t.question_type
AND x.question_sub_type = t.question_sub_type
)
ORDER BY t.question_type, t.question_sub_type
;
Modificado:
WITH types AS (
select distinct question_type, question_sub_type
FROM question_exclusion
)
SELECT t.question_type, t.question_sub_type, q.question_id
FROM question q
CROSS JOIN types t
WHERE NOT EXISTS (
SELECT * FROM question_exclusion x
WHERE 1=1
AND x.question_id = q.question_id
AND x.question_type = t.question_type
AND x.question_sub_type = t.question_sub_type
)
ORDER BY t.question_type, t.question_sub_type
;
NÃO É DIFERENTE DE
WITH types AS (
select distinct question_type, question_sub_type
FROM question_exclusion
)
SELECT t.question_type, t.question_sub_type, q.question_id
FROM question q
CROSS JOIN types t
WHERE NOT EXISTS (
SELECT * FROM question_exclusion x
WHERE 1=1
AND x.question_id = q.question_id
AND (x.question_type, x.question_sub_type) IS NOT DISTINCT FROM
(t.question_type, t.question_sub_type)
)
ORDER BY t.question_type, t.question_sub_type
;