-- 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
;
額外的獎勵點這個CTE的遞歸版本...
打我給它。同樣重要的是要注意,如果它存在使得COALESCE工作,那麼LEFT JOIN只會帶來信息。如果你使用INNER/RIGHT JOIN,這不會很好地工作。 – 2012-02-29 13:46:45
@ypercube感謝您的幫助。我意識到中間還有一個技術表。只爲老闆。你能否更新你的解決方案 – Kayser 2012-02-29 13:50:36
@ypercube藉助Coalesce,查詢變得更短,更清晰。謝謝。 – Kayser 2012-03-01 10:44:56