我需要将两张桌子连在一起。但是,要连接的表必须仅将其值应用于设置具有相同值的行。这就是我的意思......
TABLE JOIN我想要下面
** LOGGED HOURS ** ** SICK HOURS ** ** RESULT TABLE ** +--------+-------+ +--------+-------+ +--------+-------+-------+ |Name | Hours | |Name | Hours | |Name |Hours |Sick | +--------+-------+ +--------+-------+ +--------+-------+-------+ |David |47 | |David |9 | |David |47 |9 | +--------+-------+ +--------+-------+ +--------+-------+-------+ |David |9 | |David |9 |0 | +--------+-------+ +--------+-------+-------+
正常左表加入结果:
** LOGGED HOURS ** ** SICK HOURS ** ** RESULT TABLE ** +--------+-------+ +--------+-------+ +--------+-------+-------+ |Name | Hours | |Name | Hours | |Name |Hours |Sick | +--------+-------+ +--------+-------+ +--------+-------+-------+ |David |47 | |David |9 | |David |47 |9 | +--------+-------+ +--------+-------+ +--------+-------+-------+ |David |9 | |David |9 |9 | +--------+-------+ +--------+-------+-------+
注意,9适用于正常左表连接中的EACH行。我希望9只应用于名为DAVID的行集。
随意提问,谢谢。
编辑:如果您要对我的问题进行投票,请提供解释为何以及如何在将来改进我的问题。谢谢。
答案 0 :(得分:1)
因为你只需要为每个" Name"为了得到你的生病时间,选择可以是任意的,你可以使用窗口函数:
SELECT
LoggedHours.Name,
LoggedHours.Hours,
CASE WHEN ROW_NUMBER() OVER (PARTITION BY LoggedHours.Name ORDER BY 1) = 1 THEN SickHours.Hours ELSE NULL END AS SickHoursLogged
FROM
LoggedHours LEFT OUTER JOIN SickHours on LoggedHours.Name = SickHours.Name
所以...窗口/分析功能说:
按名称拆分结果集(记录组为" David" for 例子)并按顺序排序。然后给出那组记录 行号从1开始。如果此特定记录是第1行,那么它 从
SickHours
表中获取病假。否则它会得到 空。
如果......您希望它不是任意的,而是希望每个人记录的最长时间记录能够获得生病时间,您可以将ROW_NUMBER()函数更改为:
ROW_NUMBER() OVER (PARTITION BY LoggedHours.Name ORDER BY LoggedHours.Hours DESC) = 1