2013-07-09 50 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