SQL->联接表问题

时间:2018-09-10 13:55:57

标签: sql join conditional

我有两个不同的表

位置

User_ID       Locarion            start_date      end_date
----------      -------------    -------------   -------------
1               South             1-1-2018        1-5-2018
2               North             1-2-2018        1-11-2018
1               East              1-5-2018        1-9-2018

用户

User_ID       User_name       
----------      -------------   
1               Mary             
2               Sara             

使用if语句检查当前日期是否在开始日期和结束日期之间,将位置返回为当前日期

我希望它成为结果表

User_ID       User_name         current_location
----------      -------------   -------------
1               Mary             East
2               Sara             undeined

请帮助

3 个答案:

答案 0 :(得分:1)

使用左联接,其联接条件基于日期:

select u.user_id, u.user_name, l.location as current_location
from users u
  left join location l 
         on l.user_id = u.user_id 
        and current_date between l.start_date and l.end_date;

如果没有匹配项,它将以null的形式返回位置。要显示替代值,请使用coalesce(l.location, 'undefined')

BETWEEN将包含开始日期和结束日期,作为有效的“位置日期”。

如果不应包括结束日期,则需要使用其他加入条件:

select u.user_id, u.user_name, l.location as current_location
from users u
  left join location l 
         on l.user_id = u.user_id 
        and l.start_date >= current_date 
        and l.end_date < current_date;

您没有指定DBMS,但是上面是标准的ANSI SQL。

在线示例:http://rextester.com/MMHVB20021

答案 1 :(得分:0)

请尝试以下查询:

select user_id,user_name,collasce(location,'undefined')
    from usertable u left join locationtable l on u.user_id=l.user_id
    and getdate>=startdate and getdate<=enddate

答案 2 :(得分:0)

这应该相当简单,只需在User_ID上使用内部联接,并在开始和结束日期,返回位置或未定义情况下使用case语句即可。

或者,如果有没有位置的用户和要输入位置的用户,请使用其他人指定的“左联接”,但我建议不要使用BETWEEN,除非您希望结束日期位于该日期的开始时,并且不包括整个结束日期,即直到午夜。