2014-11-14 96 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