2010-08-26 85 views
4

請注意,我是一個完整的SQL noob並正在學習過程中。基於Google的搜索(包括在這裏搜索),我試過使用SELECT DISTINCT和GROUP BY,但都不起作用,可能是由於我的所有聯接(如果有人知道他們爲什麼不能完全工作,這將有助於學習)。SQL:需要刪除包含多個連接的查詢中的重複行

我需要來自各種表格和下面的數據是我知道這樣做的唯一方法(我只知道基礎知識)。下面的查詢工作正常,但顯示重複。我需要知道如何刪除這些。我現在唯一的提示可能是一個嵌套的SELECT查詢,但基於研究,我不知道如何實現它們。任何幫助都會很好,謝謝!

USE SQL_Contest 
go 
SELECT 
    CLT.Description AS ClockType, 
    CLK.SerialNumber AS JobClockSerial, 
    SIT.SiteNumber AS JobID, 
    SIT.[Name] AS JobsiteName, 
    SIT.Status AS SiteActivityStatus, 
    DHA.IssuedDate AS DHAIssuedDate, -- Date the clock was assigned to THAT jobsite 
    CLK.CreatedDate AS CLKCreatedDate, -- Date clock first was assigned to ANY jobsite 
    SES.ClockVoltage 
FROM tb_Clock CLK 
INNER JOIN tb_ClockType CLT 
ON CLK.TypeID = CLT.ClockTypeID 
INNER JOIN tb_DeviceHolderActivity DHA 
ON CLK.ClockGUID = DHA.DeviceGUID 
INNER JOIN tb_Site SIT 
ON SIT.SiteGUID = DHA.HolderGUID 
LEFT JOIN tb_Session SES 
ON SES.ClockSerialNumber = CLK.SerialNumber 
WHERE DHA.ReturnedDate IS NULL 
ORDER BY SIT.[Name] ASC 

編輯:我會很快回顧這些答案,非常感謝。我張貼額外的重複信息每羅布的要求:

一切顯示正常,直到我補充一下:

LEFT JOIN tb_Session SES 
ON SES.ClockSerialNumber = CLK.SerialNumber 

,我需要。這是複製出現時:

JobClock 2,500248E4,08-107,Brentwood Job,1,2007-05-04 13:36:54.000,2007-05-04 13:47:55.407,3049  
JobClock 2,500248E4,08-107,Brentwood Job,1,2007-05-04 13:36:54.000,2007-05-04 13:47:55.407,3049 

我想要該信息只顯示一次。基本上這個查詢是確定所有活動的工作現場有一個時鐘分配給他們,該作業只有一個時鐘分配給它,它只是一個工作現場,但它出現兩次。

編輯2:基於你們提供的幫助,我能夠確定他們實際上不是重複的,每個會話都是獨立的,這是唯一碰巧有兩個會話的人。所以現在我要試着弄清楚如何只從最新的會議中獲取信息。

+1

一些重複的行輸出的一個例子有幫助,所以我們可以看到*被複制的內容。答案几乎肯定涉及您未顯示的每個重複行中包含不同值的列之一。 – Rob 2010-08-26 18:00:59

+0

我添加了應該有用的信息,謝謝Rob! – ShadowXOR 2010-08-26 19:04:52

+0

重複中是否有拼寫錯誤,因爲'DISTINCT'會將其刪除。作爲左邊加入「ses」,我曾預計ses.clockvoltage顯示每行不同的值。否則,這意味着你有多個「ses」記錄相關,並且需要檢查你需要加入的「ses」以便在可能的情況下襬脫重複。 – 2010-08-26 20:10:24

回答

3

如果一切「工作正常」添加:

LEFT JOIN tb_Session SES 
ON SES.ClockSerialNumber = CLK.SerialNumber 

那麼就必須在tb_Session每個CLK.SerialNumber多個記錄。

運行以下查詢:

SELECT * 
FROM tb_Session SES 
WHERE ClockSerialNumber = '08-107' 

應該有兩條記錄返回。您需要決定如何處理這個問題(即您要使用哪條記錄?),除非tb_Session中的兩行都包含相同的數據,在這種情況下,他們應該如何處理?

你可以隨時更改自己的查詢:

SELECT 
    CLT.Description AS ClockType, 
    CLK.SerialNumber AS JobClockSerial, 
    SIT.SiteNumber AS JobID, 
    SIT.[Name] AS JobsiteName, 
    SIT.Status AS SiteActivityStatus, 
    DHA.IssuedDate AS DHAIssuedDate, -- Date the clock was assigned to THAT jobsite 
    CLK.CreatedDate AS CLKCreatedDate, -- Date clock first was assigned to ANY jobsite 
    SES.ClockVoltage 
FROM tb_Clock CLK 
INNER JOIN tb_ClockType CLT 
ON CLK.TypeID = CLT.ClockTypeID 
INNER JOIN tb_DeviceHolderActivity DHA 
ON CLK.ClockGUID = DHA.DeviceGUID 
INNER JOIN tb_Site SIT 
ON SIT.SiteGUID = DHA.HolderGUID 
LEFT JOIN 
(
    SELECT DISTINCT ClockSerialNumber, ClockVoltage 
    FROM tb_Session 
) SES 
ON SES.ClockSerialNumber = CLK.SerialNumber 
WHERE DHA.ReturnedDate IS NULL 
ORDER BY SIT.[Name] ASC 

爲應確保SES只包含的ClockSerialNumber每個唯一組合的一個記錄和ClockVoltage

+0

我認爲這是我的答案。他們兩人根據會議何時發生時間戳有不同的時間戳。任何想法如何告訴SQL只拉最新的會議,每序列號? – ShadowXOR 2010-08-26 22:36:37

+0

是這樣的: SELECT ClockSerialNumber,ClockVoltage FROM tb_Session小號 其中timestamp =(SELECT MAX(時間戳)FROM tb_Session S2 WHERE S.ClockSerialNumber = S2.ClockSerialNumber AND S.ClockVoltage = S2.ClockVoltage) – Rob 2010-08-26 22:52:33

+0

由於羅布,即沒它!我仍然試圖通讀它並找出原因。 :) – ShadowXOR 2010-08-26 23:34:34

0

連接不是你的問題。從你的評論我會推斷你所稱的「重複」不是實際的重複。如果查詢返回的2個「duplicateates」的所有列值都匹配,那麼SELECT DISTINCT或GROUP BY肯定會消除它們。所以你應該能夠通過查看你的列定義來找到解決方案。

我最好的猜測是你得到的重複日期不是真的重複,因爲日期的時間分量不匹配。爲了消除這個問題,你可以截斷日期字段的日期只有使用這種技術:

DATEADD(DAY, DATEDIFF(DAY, 0, DHA.IssuedDate), 0) AS DHAIssuedDate, 
    DATEADD(DAY, DATEDIFF(DAY, 0, CLK.CreatedDate), 0) AS CLKCreatedDate, 

如果不工作,你可能想看看JobClockSerial:這是否列在查詢結果中屬於?

+0

我會試一試。如果我理解這個問題,我肯定需要結果中的序列號。它列在多個表格中,我並不關心它來自哪個表格,但我確實需要最終顯示的序列。 – ShadowXOR 2010-08-26 19:06:04

1

取本示例數據集:

成分

IngredientId IngredientName 
============ ========= 
1   Apple 
2   Orange 
3   Pear 
4   Tomato 

配方

RecipeId RecipeName 
======== ========== 
1  Apple Turnover 
2  Apple Pie 
3  Poached Pears 

Recipe_Ingredient

RecipeId IngredientId Quantity 
======== ============ ======== 
1  1   0.25 
1  1   1.00 
2  1   2.00 
3  3   1.00 

注:爲什麼蘋果營業額的兩批蘋果作爲原料,是不倫不類,它只是做。

下面的查詢將返回兩行「蘋果營業額」配方,一排爲「蘋果派」的配方和一個排爲「水煮梨」的配方,因爲有2名中的條目該Recipe_Ingredient表IngredientId 1.這是一個剛剛加入會發生什麼..

SELECT I.IngredientName, 
     R.RecipeName 
FROM Ingredient I 
JOIN Recipe_Ingredient RI 
     ON I.IngredientId = RI.IngredientId 
JOIN Recipe R 
     ON RI.recipeId = R.RecipeId 

你可以得到這個,改成只返回一行:

SELECT I.IngredientName, 
     R.RecipeName 
FROM Ingredient I 
JOIN Recipe_Ingredient RI 
     ON I.IngredientId = RI.IngredientId 
JOIN Recipe R 
     ON RI.recipeId = R.RecipeId 
GROUP BY I.IngredientName, R.RecipeName 

沒有關於您的數據的更多細節,很難將其應用於您的特定場景,但演練可以幫助您瞭解「重複項」來自不熟悉SQL的某人的位置

+0

我添加了其他信息。我會很快回顧一下。 – ShadowXOR 2010-08-26 19:05:20