Conditional Inner Join

后端 未结 4 685
醉梦人生
醉梦人生 2021-02-05 05:12

I want to be able to inner join two tables based on the result of an expression.

What I\'ve been trying so far:

INNER JOIN CASE WHEN Reg         


        
相关标签:
4条回答
  • 2021-02-05 05:51

    Try putting both tables in the query using LEFT JOIN's

    LEFT JOIN TimeRegistration TR ON r.rid = TR.Id AND RegT.type =1 
    LEFT JOIN DrivingRegistration DR ON r.rid = DR.Id AND RegT.type <>1 
    

    Now, in you select clause, use

    CASE RegType.Type WHEN 1 THEN TR.SomeField ELSE DR.someField END as SomeField
    

    The other option is to use dynamic SQL

    0 讨论(0)
  • 2021-02-05 05:56

    You probably need to perform two left joins, one onto TimeRegistration and one onto DrivingRegistration, and return the fields you want from the appropriate join table something like this:

    LEFT JOIN TimeRegistration ON TimeRegistration.RegistreringsId = R.Id
    LEFT JOIN DrivingRegistration ON DrivingRegistration.RegistreringsId = R.Id
    

    and you select statement would be something like this:

    SELECT CASE WHEN RegT.Type = 1 THEN TimeRegistration.Foo ELSE DrivingRegistration.Bar END
    

    I like what you're trying to do, but I don't think SQL is that clever.

    0 讨论(0)
  • 2021-02-05 05:59

    So I had a scenario where there were three email columns in one table (don't ask why) and any of them could be null (or empty). In this example code I will just deal with a case where it is null.

    I had to join it to another table by any of the emails to retrieve the users firstname.

    Here is what worked

    select  
    
    m.email1,
    m.email2,
    m.email3, 
    m2.firstName
    
    from MyTable m
    
    left join MyOtherTable m2 on m2.Email = 
    case when m.email1 is null then 
    
        case when m.email2 is null then 
    
            case when m.email3 null then 
                'nonexistent@mydomain.com' -- i stopped here
            else m.email3 end
    
        else wm.email2 end
    
    else m.email1 end
    

    Obviously you would include further conditions like

    case when m.email1 is null or m.email1 = '' then ...
    

    To cover for empty values.

    0 讨论(0)
  • 2021-02-05 06:01
    SELECT
      R.foo, tr.bar
    FROM
      SomeTable AS R
      INNER JOIN RegistrationTypes AS RegT ON R.RegistrationTypeId = RegT.Id 
                                              AND RegT1.Type = 1
      INNER JOIN TimeRegistration AS tr    ON /* whatever */
    
    UNION 
    
    SELECT
      R.foo, dr.bar
    FROM
      SomeTable AS R
      INNER JOIN RegistrationTypes AS RegT ON R.RegistrationTypeId = RegT.Id 
                                              AND RegT1.Type = 2
      INNER JOIN DrivingRegistration AS dr ON /* whatever */
    
    0 讨论(0)
提交回复
热议问题