0

存储过程如何选择存储过程中唯一的记录

alter PROCEDURE [dbo].[Get_ProductsByCategoryId_Filter] 
@CategoryId int, 
@BrandId int, 
    @PageSize int, 
     @PageIndex int 

AS 
     SET NOCOUNT ON 

DECLARE @ParamDefinition AS NVARCHAR(2000) 

DECLARE @sql nvarchar(4000) 

SET @sql =  'select DISTINCT ProductId, Name, Description,ProductPriceId,Price,Size,Weight,ThumbnailFilename,BrandId,DeliveryId,CategoryId,HasFreeWrapping,IsPharmaceutical,BrandCategoryId,Enabled,OpenForOffer,FreeDeliveryInUK,Discontinued,EnforceStockCount,OnlyInUK,ShowPreOrderButton,MinPrice 
       from (SELECT P.[ProductId], P.[Name], P.[Description],PP.[ProductPriceId],PP.[Price],PP.[Size],PP.[Weight], M.[ThumbnailFilename],M.[MEDIAFILENAME], P.[BrandId], P.[DeliveryId], P.[CategoryId], P.[HasFreeWrapping], P.[IsPharmaceutical], P.[BrandCategoryId], P.[Enabled], P.[OpenForOffer], P.[FreeDeliveryInUK], 
           P.[Discontinued], P.[EnforceStockCount], P.[OnlyInUK], P.[ShowPreOrderButton], MIN(ISNULL(PP.[Price], 0)) AS [MinPrice], 
           ROW_NUMBER() OVER (Order By P.ProductId asc) AS 
           RowRank 
         FROM [Products] P WITH (NOLOCK) 
         LEFT JOIN [ProductPrices] PP WITH (NOLOCK) ON PP.[ProductId] = P.[ProductId] 
         INNER JOIN [ProductCategory] PC WITH (NOLOCK) ON P.[ProductId] = PC.[ProductId] 
         INNER JOIN [Categories] C WITH (NOLOCK) ON C.[CategoryId] = PC.[CategoryId] 
         inner join [Brands] b WITH (NOLOCK) ON P.[brandid]= b.[brandid] 
         inner join [ProductMedia] m with (NOLOCK) ON P.[PRODUCTID]= M.[PRODUCTID] 
        WHERE 1 = 1 AND P.Enabled = 1 AND P.Discontinued = 0 AND PP.Stock > 0 AND (C.[CATEGORYID][email protected] or @CategoryId=0) AND (P.[BRANDID][email protected] or @BrandId is null) 
        AND M.PRODUCTMEDIAID = (SELECT DISTINCT TOP 1 PRODUCTMEDIAID FROM PRODUCTMEDIA WHERE PRODUCTMEDIA.PRODUCTID= P.PRODUCTID) 
GROUP BY P.[ProductId], P.[Name], P.[Description],PP.[ProductPriceId],PP.[Price],PP.[Size],PP.[Weight], M.[ThumbnailFilename],M.[MEDIAFILENAME], P.[BrandId],B.[BrandId], P.[DeliveryId], P.[CategoryId], P.[HasFreeWrapping], P.[IsPharmaceutical], P.[BrandCategoryId], P.[Enabled], P.[OpenForOffer], P.[FreeDeliveryInUK], P.[Discontinued], P.[EnforceStockCount], P.[OnlyInUK], P.[ShowPreOrderButton] 
        ) AS ProductsWithRowNumbers 
      WHERE 

      RowRank > ' + CONVERT(nvarchar(10), @PageIndex) + 
       ' AND RowRank <= (' + CONVERT(nvarchar(10), 
@PageIndex) + ' + ' 
       + CONVERT(nvarchar(10), @PageSize) + ') ' 


       SET @ParamDefinition = '@CategoryId int,@BrandId int, @PageSize int, 
    @PageIndex int 
    ' 


-- Execute the SQL query 

EXEC sp_executesql @sql, @ParamDefinition,       
         @CategoryId, 
         @BrandId, 
          @PageSize , 
                @PageIndex 


-- 

GO 

在上面的存储过程的结果,我得到重复的记录,但我不希望显示重复的记录,请帮助我如何我可以得到吗

+2

为什么地球上您使用动态SQL?这绝对没有必要...... –

+0

根据我所需要的应用要求,可以请你帮我从这个@ marc_s – user3166404

+0

获得独特的记录(没有重复的记录)我在产品ID上使用了独特但仍然我得到了重复记录,请帮我解决这个问题@marc_s – user3166404

回答

0

虽然你使用DISTINCT,它似乎重复你得到的不是真正的重复。可能重复数据仍然包含不同的值。当您需要唯一的ProductId并希望从非唯一数据中挑选任何(对应于一个ProductId的不同记录)时,您需要在ProductId上使用GROUP BY,并在其他所有字段上使用MAX等其他聚合函数这样的:

SELECT ProductId, MAX(Name), MAX(Description)... 
GROUP BY ProductId 

如果你真的需要FIRST /任何聚合功能(SQL服务器没有这些聚集),尝试CROSS APPLY招喜欢这里:http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=60565&whichpage=2#721589或CTE招喜欢这里:SQL Server pick random (or first) value with aggregation,或者,如果你使用SQL Server 2012 +,请尝试FIRST_VALUE analytic function

+0

我想记录唯一基于productid @Dmitry llukhin我的 – user3166404

+0

一些其他列有不同的价值观,但我想只基于productid的唯一记录请帮助我@德米特里llukhin – user3166404

+0

产品ID,名称和productdescription具有相同的价值,但其他列像priceid,价格......是不同的,但我想显示独特的记录基于productid列请帮助我@德米特里llukhin – user3166404

0

我知道这是旧的,但可能会为发生的人清理一些事情。

首先,如果某行中的内容不同,则不会获取重复记录。当你执行一个DISTINCT查询,如:

Select DISTINCT productID, salesID, name, time 
FROM yourtable 

然后SQL会发现你重复行,从列不特定项目。

因此,如果任何列有不同的数据,它会识别出与其他数据不同的行......这看起来像是你得到了重复数据但可惜,事实并非如此。

如果你想不同的产品ID的列表,然后检查代码的存储Procdure并找到产品ID是从哪里来的,在这种情况下:[产品]

所以,如果你想获得真正不同的则:

Select DISTINCT ProductID 
FROM [Products] 

当然,我是在开玩笑,你不需要在上面的代码中的DISTINCT ...你肯定不会得到你正在寻找的信息。当然,您需要更多的放大信息,所以使用SELECT * FROM Products来查找要包含的产品的哪些列,并在存储过程的不同查询中使用它们(以及它们)。这应该为您提供不同的行,以显示查询中包含的产品。

TaTa