2017-05-31 10 views
0

私たちは列をたくさん含んでおり、参加する多くの複雑なクエリを持っている(以下の例を参照)のビューとして実装されています。SQL Serverの - 複雑なクエリでオーバー/ 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

は、私はあなたのクエリでテーブルを作成してみてください – Jayvee

答えて

1

あなたは以下のようにROW_NUMBER使用することができます。クエリ下のみ注文番号に重複して選択しないだろう、あなたが他の列を追加する必要がある場合は、それに応じ

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

をウィンドウ関数を使用することができると思うとROW_NUMBERを使用した後はありません、この場合には、凝集に理にかなっています。上記の質問への回答 – Jayvee

+0

dupesを避けるために、OPが重複排除する方法を尋ねるのではなく、どのようにクエリを向上させるために –

+0

: –

0

を追加します行全体が正確に複製されていますか?もしそうなら、あなたが同じ最も列重複行を取得しているが、一部の列が同じですGROUP BY列異なっており、に余分な行を引き起こしているもののためMIN(column_name)を選択した場合、単にDISTINCT

SELECT DISTINCT 
    ... 
FROM 
    ... 

を追加現れる。

関連する問題