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