2016-11-10 72 views
0

以下查詢返回ID列表和時間列表。它從左表中返回multimple,因爲它在右表中顯示爲多個。當右表中有多個值時,左連接無左表中的重複值

目前它帶回這樣的:

enter image description here

我希望它來自右錶帶回的最小值爲左表中的每個ID。

任何幫助表示讚賞!

set language british 
SELECT dbo.Employee.EmployeeID, SUBSTRING(CONVERT(varchar, ClockTemp.ClockTime, 108), 1, 5) as ClockTime 
FROM dbo.Employee LEFT JOIN 
(
    Select [ClockID] 
     ,[EmployeeID] 
     ,[ClockTypeID] 
     ,[ClockDate] 
     ,[ClockTime] 
    FROM dbo.Clock 
    WHERE dbo.Clock.ClockDate = DATEADD(DD, 0, CAST('07-11-2016' AS DATE)) AND Clock.ClockTypeID=1 
) As ClockTemp 
ON dbo.Employee.EmployeeID = ClockTemp.EmployeeID 
ORDER BY dbo.Employee.EmployeeID,clocktemp.ClockTime 
+2

你有沒有在子查詢嘗試了GROUP BY? – jarlh

+0

試過剛加入 GROUP BY [ClockTime],[ClockID],[EmployeeID],[ClockTypeID],[ClockDate] 在WHERE下面卻無法讓它工作... – hero9989

+0

您也可以試試'SELECT DISTINCT dbo .Employee.EmployeeID,.....' –

回答

0

也許此查詢適用於您。您不需要按Clocktime進行排序,因爲最小值將從MIN聚合中獲取。

如果您使用的是SQL 2008,我還會將Clocktime字段更改爲TIME,以便您可以避免子字符串轉換。

set language british 
SELECT dbo.Employee.EmployeeID, SUBSTRING(CONVERT(varchar, MIN(ClockTemp.ClockTime), 108), 1, 5) as ClockTime 
FROM dbo.Employee LEFT JOIN 
(
    Select [ClockID] 
     ,[EmployeeID] 
     ,[ClockTypeID] 
     ,[ClockDate] 
     ,[ClockTime] 
    FROM dbo.Clock 
    WHERE dbo.Clock.ClockDate = DATEADD(DD, 0, CAST('07-11-2016' AS DATE)) AND Clock.ClockTypeID=1 
) As ClockTemp 
ON dbo.Employee.EmployeeID = ClockTemp.EmployeeID 
GROUP BY dbo.Employee.EmployeeID 
ORDER BY dbo.Employee.EmployeeID 
+0

工作起來很棒,甚至沒有編輯任何東西來使它在我的數據庫中工作。謝謝! – hero9989

+0

@ hero9989:謝謝你接受我的回答。祝你愉快 –

0

試一下:

WITH minClockTimeCTE AS (
    SELECT EmployeeID, min(ClockTime) as ClockTime 
    FROM ClockTemp 
    GROUP BY EmployeeID 
) 
SELECT Employee.EmployeeID, minClockTimeCTE.ClockTime 
FROM Employee 
LEFT OUTER JOIN minClockTimeCTE 
    ON Employee.EmployeeID = minClockTimeCTE.EmployeeID 
0

你可以改變左連接到外部應用前1:

SELECT dbo.Employee.EmployeeID, 
    SUBSTRING(CONVERT(varchar, ClockTemp.ClockTime, 108), 1, 5) as ClockTime 
FROM dbo.Employee 
OUTER APPLY 
(
    SELECT TOP 1 [ClockID] 
     ,[EmployeeID] 
     ,[ClockTypeID] 
     ,[ClockDate] 
     ,[ClockTime] 
    FROM dbo.Clock 
    WHERE dbo.Clock.ClockDate = DATEADD(DD, 0, CAST('07-11-2016' AS DATE)) 
     AND Clock.ClockTypeID=1 
     AND dbo.Employee.EmployeeID = ClockTemp.EmployeeID 
    ORDER BY ClockTime 
) As ClockTemp 
ORDER BY dbo.Employee.EmployeeID,clocktemp.ClockTime