2017-05-31 20 views
0

我們有很多複雜的查詢,它們涉及很多實現爲視圖的列和連接(請參見下面的示例)。SQL Server - 在複雜查詢中使用Over/Partion

在某些情況下,這些查詢返回重複的行,然後必須通過消費應用程序以編程方式刪除。因此,我們希望增強SQL查詢以消除重複項,並加快檢索過程。

我知道我可以使用OVER/PARTITION BY邏輯來做到這一點,但我不確定如何修改查詢以獲得工作語法。

下面是一個例子:

SELECT 
    Main.MfgOrder.OrderNumber, 
    Main.MfgOrder.DesignBOMID, 
    Main.Design_Plant.PlantID, 
    Main.MfgOrder_Operation.OrderOpID, 
    Main.MfgOrder_Operation.DesignOpID, 
    Main.MfgOrder_Operation.OpSeq, 
    Main.MfgOrder_Operation.Description, 
    Main.MfgOrder_Operation.CompletionStatus, 
    Main.MfgOrder__Shift.OrderShiftID, 
    Main.MfgOrder__Shift.WorkCenterMachineID, 
    Main.MfgOrder___Event.OrderEventID, 
    Main.MfgOrder____Reel.OrderReelID, 
    Main.MfgOrder____Reel.ReelNumber, 
    Main.MfgOrder____Reel.Location, 
    Main.MfgOrder____Reel.Test_Status AS Test_Status_Reel, 
    Main.MfgOrder____Reel.Test_Disposition AS Test_Disposition_Reel, 
    Main.MfgOrder____Reel.LabReleased, 
    Main.MfgOrder____Reel.ShipReelsBypassSet, 
    Main.MfgOrder_____Length.OrderLengthID, 
    Main.MfgOrder_____Length.LengthType, 
    Main.MfgOrder_____Length.LocationOnReel, 
    Main.MfgOrder_____Length.LocationOnLength, 
    Main.MfgOrder_____Length.TrialNumber, 
    Main.MfgOrder_____Length.SampleNumber, 
    Main.MfgOrder_____Length.PrintNumber, 
    Main.MfgOrder_____Length.Test_Status AS Test_Status_Length, 
    Main.MfgOrder_____Length.Test_Category, 
    Main.MfgOrder_____Length.Test_Disposition AS Test_Disposition_Length, 
    Main.MfgOrder_____Length.SampleSubmittedBy, 
    Main.MfgOrder_____Length.SampleSubmittedDate, 
    Main.MfgOrder_____Length.BypassTesting, 
    Main.MfgOrder_____Length_OperatorQty.Sample1Destination, 
    Main.MfgOrder_____Length_OperatorQty.Sample2Destination, 
    Main.MfgOrder_____Length_OperatorQty.Sample3Destination, 
    Main.MfgOrder______Component.OrderComponentID, 
    Main.MfgOrder______Component.DesignComponentID, 
    Main.MfgOrder______Component.ItemNo, 
    Main.MfgOrder_______Test.LabTestID, 
    Main.MfgOrder_______Test.OrderTestID, 
    Main.MfgOrder_______Test.TestComplete, 
    Main.MfgOrder_______Test.TestStatus, 
    Main.MfgOrder________Marker2.OrderMarkerID, 
    Master.Color.ColorName, 
    Master.LabTest.ExcludeFromPassFail, 
    CASE 
     WHEN Main.Design_Component.Component_Label IS NULL 
      THEN 'Unknown' 
      ELSE Main.Design_Component.Component_Label 
    END AS Component_Label 
FROM 
    Main.MfgOrder 
INNER JOIN 
    Main.Design__BOM ON Main.MfgOrder.DesignBOMID = Main.Design__BOM.DesignBOMID 
INNER JOIN 
    Main.Design_Plant ON Main.Design__BOM.DesignPlantID = Main.Design_Plant.DesignPlantID 
INNER JOIN 
    Main.MfgOrder_Operation ON Main.MfgOrder.OrderNumber = Main.MfgOrder_Operation.OrderNumber 
INNER JOIN 
    Main.MfgOrder__Shift ON Main.MfgOrder_Operation.OrderOpID = Main.MfgOrder__Shift.OrderOpID 
INNER JOIN 
    Main.MfgOrder___Event ON Main.MfgOrder__Shift.OrderShiftID = Main.MfgOrder___Event.OrderShiftID 
INNER JOIN 
    Main.MfgOrder____Reel ON Main.MfgOrder___Event.OrderEventID = Main.MfgOrder____Reel.OrderEventID 
INNER JOIN 
    Main.MfgOrder_____Length ON Main.MfgOrder____Reel.OrderReelID = Main.MfgOrder_____Length.OrderReelID 
LEFT OUTER JOIN 
    Main.MfgOrder______Component ON Main.MfgOrder_____Length.OrderLengthID = Main.MfgOrder______Component.OrderLengthID 
LEFT OUTER JOIN 
    Main.MfgOrder_______Test ON Main.MfgOrder______Component.OrderComponentID = Main.MfgOrder_______Test.OrderComponentID 
LEFT OUTER JOIN 
    Main.MfgOrder________Marker2 ON Main.MfgOrder_______Test.OrderTestID = Main.MfgOrder________Marker2.OrderTestID 
LEFT OUTER JOIN 
    Main.Design_Component ON Main.MfgOrder______Component.DesignComponentID = Main.Design_Component.DesignComponentID 
LEFT OUTER JOIN 
    Master.Color ON Main.MfgOrder______Component.TapeColorID = Master.Color.ColorNumber 
LEFT OUTER JOIN 
    Master.LabTest ON Main.MfgOrder_______Test.LabTestID = Master.LabTest.LabTestID 
LEFT OUTER JOIN 
    Main.MfgOrder_____Length_OperatorQty ON Main.MfgOrder______Component.OrderLengthID = Main.MfgOrder_____Length_OperatorQty.OrderLengthID 
+0

哪個ID列顯示爲重複?它可能只是可以在連接中解析。但是,如果您可以告知哪個ID是重複的,應該能夠協助您提出的問題。 – Leonidas199x

+0

over分區與聚合有意義,在這種情況下,我不認爲你可以使用窗口函數 – Jayvee

回答

1

您可以按以下使用ROW_NUMBER:下面的查詢將不僅ORDERNUMBER選擇重複的,如果你需要添加你添加相應

Select * from (
    Select 
     RowN = Row_Number() over(partition by Main.MfgOrder.OrderNumber order by Main.MfgOrder.OrderNumber), 
     --- All your select columns and all your query with joins 
) a 
    Where a.RowN = 1 
+0

OP不問如何重複數據刪除,但如何改進查詢以避免重複使用 – Jayvee

+0

嘗試使用查詢創建表並使用row_number 。 –

+0

以上問題的答案: –

0

其他列整行是否完全重複?如果是的話只需添加DISTINCT

SELECT DISTINCT 
    ... 
FROM 
    ... 

如果您得到大多數列相同的,但一些列不同,那麼GROUP BY是相同的,並選擇MIN(column_name)對於那些造成額外行的那些列重複的行出現。