Sql server SQL Server-在复杂查询中使用Over/Partition By

Sql server SQL Server-在复杂查询中使用Over/Partition By,sql-server,sql-server-2012,Sql Server,Sql Server 2012,我们有许多复杂的查询,这些查询涉及许多列和连接(参见下面的示例),它们被实现为视图 在某些情况下,这些查询返回重复的行,消费应用程序必须以编程方式删除这些行。因此,我们希望增强SQL查询以消除重复项,并加快检索过程 我知道我可以使用OVER/partitionby逻辑来实现这一点,但我不确定如何修改查询以获得有效的语法 以下是一个例子: SELECT Main.MfgOrder.OrderNumber, Main.MfgOrder.DesignBOMID, Main.De

我们有许多复杂的查询,这些查询涉及许多列和连接(参见下面的示例),它们被实现为视图

在某些情况下,这些查询返回重复的行,消费应用程序必须以编程方式删除这些行。因此,我们希望增强SQL查询以消除重复项,并加快检索过程

我知道我可以使用
OVER/partitionby
逻辑来实现这一点,但我不确定如何修改查询以获得有效的语法

以下是一个例子:

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

您可以按如下方式使用行号:如果您需要添加相应的其他列,下面的查询将不会选择“仅对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

整行是否完全重复?如果是这样,那么只需添加
DISTINCT

SELECT DISTINCT 
    ...
FROM
    ...

如果您得到的是重复的行,其中大多数列相同,但某些列不同,则按相同的列分组,并为导致出现额外行的列选择
MIN(列名称)

哪个ID列显示为重复?这可能只是因为可以在联接中解析。但是,如果您可以建议复制的是哪个ID,则应该能够帮助您询问。通过聚合,分区是有意义的,在这种情况下,我不认为您可以使用窗口功能OP不是询问如何消除重复数据,而是询问如何改进查询以避免在使用行号后使用查询重复创建表。上述问题的答案:上述问题的答案:1。我们不能使用group by或select distinct,因为重复只出现在4列中。2.在这种情况下,需要取消安装的列有:Main.MfgOrder.OrderNumber、Main.MfgOrder\u Operation.OrderOpID、Main.MfgOrder\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu3。看起来Kannan建议的答案可能有效-将尝试-谢谢Kannan的上述建议解决了问题-谢谢!