2014-11-14 60 views
0

我试图根据表1中另一个字段的值加入字段(在表1中)到表2或表3中。SQL加入条件

我的COMM表(1)看起来像这样:

CommID User ID Type 
100  987  SER 
101  123  EMP 

SER(2)和EMP(3)会给我对这些用户的信息。我需要加入COMM表中的User IDSEREMP,具体取决于COMMM中的Type字段。这是行不通的,但可以说明我正在尝试做什么:

SELECT * 
CASE 
    WHEN comm.type = 'SER' THEN ser.userName 
    ELSE emp.userName 
END 
FROM COMM 
LEFT JOIN SER on SER.userID = comm.UserID and comm.type = 'SER' 
LEFT JOIN EMP on EMP.userID = comm.UserID and comm.type = 'EMP' 

任何想法?

+0

请格式化您的代码。 – 2014-11-14 19:23:28

回答

2

您应该限制*列只列从comm,然后从其他表(S)添加列:

select comm.*, 
CASE WHEN comm.type = 'SER' THEN ser.userName ELSE emp.userName END 
FROM COMM 
LEFT JOIN SER on SER.userID = comm.UserID and comm.type = 'SER' 
LEFT JOIN EMP on EMP.userID = comm.UserID and comm.type = 'EMP' 
+0

*后有一个逗号。我刚刚离开了这个。该语句的语法是正确的。我正在获得结果。只是结果不对。我在类型中得到了EMP中的一行的正确权限,但是我知道在类型中有SER的行中的值为NULL。 – 2014-11-14 19:34:06

+1

请记住,这将返回SER和EMP表中的所有列。您可能希望它实际上是“SELECT COMM。*,”,以便仅从COMM中选择所有列。 – Michael 2014-11-14 19:34:58

+0

@迈克尔伟大的一点 - 我已经包括在我的答案。 – 2014-11-14 19:43:45

0

个人而言,我会用UNION - probalby UNION ALL在这种情况下:

SELECT 
    comm.*, 
    ser.userName 
FROM 
    comm 
    JOIN 
    SER 
    ON 
    SER.userID = comm.UserID 
WHERE 
    comm.type = 'SER' 
UNION ALL 
SELECT 
    comm.*, 
    emp.userName 
FROM 
    coom 
    JOIN 
    emp 
    ON 
    emp.userID = comm.UserID 
WHERE 
    comm.type = 'EMP' 
; 

这将工作在两个表中的类型是兼容的(如果用户名应该)。

UNION ALL选择来自SELECTS的所有行 - 它不排除重复项(这里,我假设这可能不是真正的重复项)。

+0

我可以看到UNION会得到我需要的东西,但是这是一个非常大的查询的一小部分,所以我希望减少一些错误:( – 2014-11-14 19:43:09

+0

我想出了我的问题,我使用了错误的字段。ARRRGGHHH !!!问题解决了,谢谢! – 2014-11-14 19:57:10