基于列内容的条件SQL JOIN

时间:2013-07-09 14:48:11

标签: sql join conditional

我有一个表 event_sessions ,其中包含 session_submitted_by ID和 session_submitter_type 。我需要根据session_submitter_type的内容将session_submitted_by连接到两个不同的表中的一个。

我不能在两个表上执行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

有关如何编写此代码而不必求助于UNION的任何建议吗?

1 个答案:

答案 0 :(得分: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检查以维护伪代码的语义。