2013-07-09 52 views
0

我有一個表,event_sessions包含session_submitted_by ID和session_submitter_type。我需要根據session_submitter_type的內容將session_submitted_by加入到兩個不同表中的一個表中。條件SQL JOIN基於列的內容

我不能只在這兩個表上執行LEFT OUTER JOIN,並選擇哪個返回內容,因爲這兩個表都可能包含ID匹配。

這裏是我的不當SQL /僞代碼,顯示我想要做到:

SELECT es.event_session_id, 
      subu.first_name + ' ' + subu.last_name as submitted_by_name, 
      subu.email as submitter_email 
    FROM event_session es 
CASE WHEN es.session_submitter_type = 'speaker' 
    THEN 
     LEFT OUTER JOIN speakers subu 
     ON subu.speaker_id = es.session_submitted_by      
    ELSE 
     LEFT OUTER JOIN users subu 
     ON subu.user_id = es.session_submitted_by        
    END 

任何建議如何實現代碼,而不必求助於工會嗎?

+0

爲什麼不使用UNION ALL?你在這兩張牌桌上是否有任何記錄? – makciook

+0

是的,我的session_submitted_by ID值可能發生在發言者和用戶表中......但不會是兩個表中的同一個人。 – pter

回答

2

有趣的問題。我會做它像這樣:

SELECT es.event_session_id, 
     coalesce(spk.first_name, usr.first_name) 
     + ' ' + coalesce(spk.last_name, usr.last_name) as submitted_by_name, 
     coalesce(spk.email, usr.email) as submitter_email 
FROM event_session es 
    LEFT OUTER JOIN speakers spk 
    ON es.session_submitter_type = 'speaker' and spk.speaker_id = es.session_submitted_by      
    LEFT OUTER JOIN users usr 
    ON es.session_submitter_type <> 'speaker' and usr.user_id = es.session_submitted_by 

你基本上使用兩個左外連接,和一個只有一個是曾經打算爲event_session的任何給定行是活動的。

注意:如果session_submitter_type爲空,則需要在第二次連接中添加NULL檢查以維護僞代碼的語義。

+0

enl8enmentnow,爲我的目的完美工作。非常感謝你。 – pter

+0

太棒了,你可以選擇它作爲答案嗎? – enl8enmentnow

+0

聖潔的廢話。在過去的三天裏,我一直在爲這件事煩惱不已,並且你一起來告訴我如何一舉完成。 Upvoted。謝啦。 – Will