SQL连接表仅对每个集应用一次值

时间:2016-05-12 15:41:05

标签: sql oracle oracle-sqldeveloper

我需要将两张桌子连在一起。但是,要连接的表必须仅将其值应用于设置具有相同值的行。这就是我的意思......

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的行集。

随意提问,谢谢。

编辑:如果您要对我的问题进行投票,请提供解释为何以及如何在将来改进我的问题。谢谢。

1 个答案:

答案 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