2016-05-12 25 views
-1

我需要將兩個表連接在一起。但是,要連接的表只能將其值一次應用於設置具有相同值的行。這就是我的意思是......SQL連接表只應用一次到每個集合

表連接的I WANT低於

 
** 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  | 
+--------+-------+      +--------+-------+-------+ 

師範大學LEFT 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  |9  | 
+--------+-------+      +--------+-------+-------+ 

公告,9應用於每行在正常的左表中加入。我希望9只能應用於名爲DAVID的行集合。

隨意任何問題,謝謝。

編輯:如果你打算投票回答我的問題,請提供解釋爲什麼以及如何在將來改進我的問題的禮貌。謝謝。

+0

什麼是「名稱類別值」?這是你在這裏沒有顯示的字段嗎?你能否在上面的例子中更新你的模式來反映這個領域。 – JNevill

+0

我不認爲你明白JOIN的概念。請更新您的問題以更好地解釋您的期望結果。也許一些情況會有所幫助? –

+0

名稱類別值:基本上所有在某列中共享相同值的行。例如。選擇名稱爲David的所有行。那組行。 –

回答

1

既然你只是想爲每個「名稱」讓你生病的時間和選擇的單個記錄可以隨心所欲,你可以使用一個窗口函數:

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 

所以......那個窗口/分析功能說:

拆分結果的名稱和任何命令他們(與「大衛」的 例如記錄組)設置。然後給這組記錄 行號從1開始。如果此特定記錄是第1行,則它 從SickHours表中獲得病假。否則它得到 空。

如果......你希望它不是隨意的,而是想與最大記錄的時間記錄每個人得到生病時,你可以改變這種ROW_NUMBER()函數:

ROW_NUMBER() OVER (PARTITION BY LoggedHours.Name ORDER BY LoggedHours.Hours DESC) = 1 
+1

這不會導致一些SickHoursLogged獲得NULL值嗎? –

+0

這肯定會導致一些SickHoursLogged獲得NULL值。如果你想要一個0,那麼將該NULL改爲0。 – JNevill

相關問題