-- SET search_path='tmp';
DROP TABLE tmp.products;
CREATE TABLE products
(product CHAR(1)
, emp_id INTEGER
, team_id INTEGER
);
INSERT INTO products(product,emp_id,team_id)
VALUES ('A',1,3), ('B',2,4), ('C',NULL,3), ('D',2,3), ('E',NULL,4);
DROP TABLE tmp.names;
CREATE TABLE names
(id INTEGER
, zname varchar
);
INSERT INTO names(id,zname)
VALUES (1, 'Jim') ,(2, 'Carrey') ,(3, 'Bill') ,(4, 'Clinton') ;
DROP TABLE tmp.teams;
CREATE TABLE teams
(team_id INTEGER NOT NULL
, boss_id INTEGER NOT NULL
);
INSERT INTO teams(team_id,boss_id) VALUES (3,4) , (4,4);
WITH lutser(prod,id,team) AS
(
SELECT k1.product AS prod
, k1.emp_id AS id
, k1.team_id AS team
FROM tmp.products k1
UNION
SELECT k2.product AS prod
, t.boss_id AS id
, k2.team_id AS team
FROM tmp.products k2
JOIN tmp.teams t ON t.team_id = k2.team_id
WHERE k2.emp_id IS NULL
)
SELECT l.prod
, l.id
, l.team
, n.zname
FROM lutser l
JOIN names n ON n.id = l.id
;
余分なボーナスポイント...
はそれを私にビート。 LEFT JOINは、COALESCEを動作させている場合にのみ情報を持ち出すことに注意することも重要です。 INNER/RIGHT JOINを使用した場合、これはうまく動作しません。 –
@ypercube助けてくれてありがとう。私はその間に温度表もあることに気づいた。ボスのみ。 – Kayser
@ypercube Coalesceを使用すると、クエリが短くなり、より明確になりました。ありがとう。 – Kayser