SQL Query重复相同的结果

时间:2011-11-28 03:14:41

标签: sql sql-server-2008

我无法弄清楚如何从SQL Server中的查询中删除重复的结果。我尝试将ProductID更改为另一个表中的一个,但这不起作用。任何帮助将不胜感激。

SELECT DISTINCT M.ProductID,P.ProductDesc,ComponentID,ComponentQty,UnitPrice
FROM  Product P, Manufactured M, ProductSupplier PS
WHERE P.ProductID=PS.ProductID
AND P.ProductID=M.ProductID
AND upper(P.ProductDesc) LIKE upper('Hack Saw%')
OR upper(P.ProductDesc) LIKE upper('saw blade%')
OR upper(P.ProductDesc) LIKE upper('saw handle%')
ORDER BY M.ProductID ASC

产生的输出是:

ProductID  ProductDesc  ComponentID  ComponentQty  UnitPrice
---------  -----------  -----------  ------------  ---------
3          Hack Saw     26           1             27.0000
3          Hack Saw     27           1             27.0000
3          Saw Blade    26           1             2.2500
3          Saw Blade    27           1             2.2500
3          Saw Handle   26           1             3.1700
3          Saw Handle   27           1             3.1700
11         Saw Blade    12           1             2.2500
11         Saw Blade    31           1             2.2500
11         Saw Handle   12           1             3.1700
11         Saw Handle   31           1             3.1700
22         Saw Blade    5            1             2.2500
22         Saw Blade    20           1             2.2500  
22         Saw Blade    21           1             2.2500
22         Saw Handle   5            1             3.1700
22         Saw Handle   20           1             3.1700
22         Saw Handle   21           1             3.1700

4 个答案:

答案 0 :(得分:3)

结果中没有重复记录,ComponentID值使行不同。从结果集中删除ComponentID将使行显示更相似,并且DISTINCT应删除明显的重复项。但是,您可能有一个更基本的问题,要么您有不同组件的多个条目,要么您正在为结果加入一个额外的表。

答案 1 :(得分:2)

您可以在SQL 2008中使用Common Table Expression获取不同的行:您可以将PARTITION BY更新为仅包含您在考虑唯一记录时要使用的列。

WITH WithRowNumber AS
(
   SELECT M.ProductID,P.ProductDesc,ComponentID,ComponentQty,UnitPrice
      , ROW_NUMBER() OVER (PARTITION BY M.ProductID, P.ProductDesc, ComponentID
         , ComponentQty, UnitPrice ORDER BY M.ProductID ASC) AS RowNumber
   FROM Product AS P
   INNER JOIN Manufactured AS M ON P.ProductID = M.ProductID
   INNER JOIN ProductSupplier AS PS ON P.PruductId = PS.ProductID
   WHERE UPPER(P.ProductDesc) LIKE UPPER('Hack Saw%')
      OR UPPER(P.ProductDesc) LIKE UPPER('saw blade%')
      OR UPPER(P.ProductDesc) LIKE UPPER('saw handle%')
)
SELECT wrn.ProductID, wrn.ProductDesc, wrn.ComponentID, wrn.ComponentQty
   , wrn.UnitPrice
FROM WithRowNumber AS wrn
WHERE wrn.RowNumber = 1

答案 2 :(得分:1)

从SELECT中删除 ComponentID ,它将消除明显的重复。

答案 3 :(得分:0)

您的CompoentID是否存储在ProductSupplier表中?可能是您在ProductSupplier表中有重复的条目,因为您有不同的ComponentID但数量/单位价格相同。

如果这实际上是您的应用程序中的常见业务场景,或者可能从生效日期开始识别,则必须澄清更多信息。