基于右表中的列值与行进行sql左外部联接

基于右表中的列值与行进行sql左外部联接,sql,left-join,Sql,Left Join,我有两个具有多对一关系的表A和表B,即对于表A中的每个记录,表B中可能有一行或多行。我将表A与表B在列上连接在一起:A.Employee_Id=B.Employee_Id 例如,对于表A中的员工1,表B中可能有两行:第一行Event_ID=R和第二行Event_ID=S。对于员工2,可能只有一行Event_ID=R 所以基本上,我希望表B中的行根据事件Id的列值按F、S和R的顺序为每个员工排序,然后从这个顺序中选择第一行,与表A连接 我只希望在结果中为每个员工返回一条记录。当然,如果没有记录,则

我有两个具有多对一关系的表A和表B,即对于表A中的每个记录,表B中可能有一行或多行。我将表A与表B在列上连接在一起:A.Employee_Id=B.Employee_Id

例如,对于表A中的员工1,表B中可能有两行:第一行Event_ID=R和第二行Event_ID=S。对于员工2,可能只有一行Event_ID=R

所以基本上,我希望表B中的行根据事件Id的列值按F、S和R的顺序为每个员工排序,然后从这个顺序中选择第一行,与表A连接

我只希望在结果中为每个员工返回一条记录。当然,如果没有记录,则为空值

请建议如何以优化的方式实现这一点

Table A Columns:
Employee_Id,  First_Name,  Last_Name

Table B Columns:
Employee_Id, Event_Id, Event_Comment

您没有给出一个模式,所以在这里稍微增加了一点,但下面类似的内容应该可以工作:

      SELECT CASE WHEN B.EVENTID = 'F' THEN '1'
                  WHEN B.EVENTID = 'S' THEN '2'
                  ELSE '3' END AS ORDER,
      A.EmployeeId,
      B.EventId 
        FROM TableA AS A
        LEFT JOIN TableB AS B
        ON A.EmployeeId = B.EmployeeId
        GROUP BY A.EmployeeId,B.EventId
        Order by A.EmployeeId DESC
      Where ORDER = '1'
具有行号的数据库

select a.Employee_Id, a.First_Name, a.Last_Name,
       b.Event_Id, b.Event_Comment   
from TableA a
     left join
     (select Employee_Id, Event_Id, Event_Comment,
             row_number() over(partition by Employee_Id 
                               order by case Event_ID 
                                        when 'F' then 1 
                                        when 'S' then 2 
                                        when 'R' then 3 end) as rw
    ) b
    on a.Employee_Id = b.Employee_Id
where rw is null or rw = 1; 
Ansi SQL,但每个雇主可能仍有几行-如果表B中有一个雇主的相同EventID:

select a.Employee_Id, a.First_Name, a.Last_Name,
       tmp.Event_Id, tmp.Event_Comment
from 
tableA a 
 left join 
 (select Employee_Id, Event_Id, Event_Comment 
  from TableB b
        join (select Employee_Id, min(case Event_ID 
                                     when 'F' then 1 
                                     when 'S' then 2 
                                     when 'R' then 3 end) as min_event
            from TableB group by Employee_Id
           ) t 
       on t.Employee_Id = b.Employee_Id
          and t.min_event = case b.Event_ID 
                             when 'F' then 1 
                             when 'S' then 2 
                             when 'R' then 3 end
 ) tmp                                       
 on a.Employee_Id = tmp.Employee_Id;

如果您使用的是sql-server,则可以使用。您使用的是什么数据库?我使用的是Oracle 10G。这将提供B中的所有行,OP提到他只需要第一行。添加带分区的行号,并根据我未正确读取的位选择行号=1的位置。这里可能需要嵌套select。非常感谢您的回复。这里还有一个问题,事件id值F、S、R不能正确地归入降序类别。那么,有没有建议优先选择F行、S行和R行?在第四列中添加一个case语句F=1、S=2、R=3,并按其排序,而不是按行数中的EventId排序。虽然如果你这样做了,你可能会把行数去掉。谢谢你的建议。案例陈述解决了问题。第一个查询对我来说非常有效。非常感谢你。