2012-02-29 52 views
1

如何管理此查询。我想在查询中只有一个人。如果empId列中有一个id,那么他的名字。否则,老板的名字。Case或If,在SQL中选择什么

Product empId teamId 
---------------------- 
A  1  3 
B  2  4 
C    3 
D  2  3 
E    4 

User Table 
Id Name 
----------- 
1 Jim 
2 Carrey 
3 Bill 
4 Clinton 

Team Table 
Team_Id BossId 
----------- 
3 3 
4 4  

结果应该是这样的:

Product user.name 
----------------- 
A  Jim 
B  Carrey 
C  Bill 
D  Carrey 
E  Clinton 

回答

3

使用CASECOALESCE()功能:

SELECT 
    x.Product 
    , COALESCE(emp.Name, boss.Name) AS Name 
FROM 
    TableX AS x 
    LEFT JOIN 
    User AS emp 
     ON emp.Id = x.empId 
    LEFT JOIN 
    User AS boss 
     ON boss.Id = x.bossId 

更新时间:

SELECT 
    x.Product 
    , COALESCE(emp.Name, boss.Name) AS Name 
FROM 
    TableX AS x 
    LEFT JOIN 
    User AS emp 
     ON emp.Id = x.empId 
    LEFT JOIN 
     Team As t 
    JOIN 
     User AS boss 
     ON boss.Id = t.bossId 
     ON t.team_Id = x.teamId 
+1

打我给它。同样重要的是要注意,如果它存在使得COALESCE工作,那么LEFT JOIN只会带来信息。如果你使用INNER/RIGHT JOIN,这不会很好地工作。 – 2012-02-29 13:46:45

+0

@ypercube感谢您的帮助。我意识到中间还有一个技术表。只为老板。你能否更新你的解决方案 – Kayser 2012-02-29 13:50:36

+0

@ypercube借助Coalesce,查询变得更短,更清晰。谢谢。 – Kayser 2012-03-01 10:44:56

2

事情是这样的:

SELECT 
    Table1.Product, 
    CASE 
     WHEN Table1.empId IS NULL 
     THEN Boss.name 
     ELSE Emp.name 
    END 
FROM 
    Table1 
    LEFT JOIN [User] AS Emp 
     ON Emp.Id =Table1.empId 
    LEFT JOIN Team 
     ON Team.Team_Id =Table1.teamId 
    LEFT JOIN [User] AS Boss 
     ON Boss.Id=Team.BossId 
+0

感谢您的帮助。需求有一点变化。你能更新你的解决方案吗? – Kayser 2012-02-29 13:52:44

+0

是的,我做到了 – Arion 2012-02-29 13:56:05

+0

非常感谢。选择一个非常困难。 (ypercube或你)。我选择了较短的一个。 – Kayser 2012-03-01 10:44:45

1
SELECT Y.Product, U.Name 
    FROM YourTable AS Y 
     JOIN Users AS U ON Y.empId = U.Id 
UNION 
SELECT Y.Product, U.Name 
    FROM YourTable AS Y 
     JOIN Team AS T ON Y.teamId = T.Team_Id 
     JOIN Users AS U ON T.BossId = U.Id 
WHERE Y.empId IS NULL; 
1
-- 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的递归版本...