0

我有一个表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 的情况下对其进行编码?

4

1 回答 1

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 检查以维护伪代码的语义。

于 2013-07-09T14:57:20.800 回答