-- 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