基于右表中的列值与行进行sql左外部联接
我有两个具有多对一关系的表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连接 我只希望在结果中为每个员工返回一条记录。当然,如果没有记录,则为空值 请建议如何以优化的方式实现这一点基于右表中的列值与行进行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连接 我只希望在结果中为每个员工返回一条记录。当然,如果没有记录,则
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排序。虽然如果你这样做了,你可能会把行数去掉。谢谢你的建议。案例陈述解决了问题。第一个查询对我来说非常有效。非常感谢你。