2010-01-05 33 views
0

現在,下面的查詢檢索多個產品記錄。如何將結果集限制爲僅檢索每個product_ID的一條記錄?多個記錄將從不同的產品返回,但每個product_id只需要一個產品線。這是MS SQL 2005基於product_id返回不同的產品

SELECT DISTINCT dbo.Products.Product_ID AS Expr1, 
       CASE 
           WHEN dbo.Products.thumbnail  IS NULL 
           OR    dbo.Products.thumbnail = '' 
           THEN dbo.Products.Smimage 
           ELSE dbo.Products.thumbnail 
       END AS image                           , 
       dbo.Products.ProductTitle                        , 
       '<img WIDTH="62" src="http://media.companyinc.com/companyinc/SKUimages/small/' + dbo.Products.Smimage + '">' AS URLImage, 
       dbo.INV_dropshippers_To_ProductOptions.sku                    , 
       dbo.Products.Discontinued                        , 
       dbo.Products.CloseOut                         , 
       dbo.Products.Special                         , 
       dbo.Products.Active                          , 
       dbo.Products.location_id                        , 
       dbo.INV_dropshippers_To_ProductOptions.dropshipper_id                 , 
       dbo.Products.season                          , 
       dbo.Products.thumbnail                         , 
       dbo.Products.Smimage                         , 
       dbo.Products.CustomField2                        , 
       dbo.Products.pt_type                         , 
       dbo.Products.PartNumber                         , 
       dbo.Products.RetailPrice AS Price                      , 
       dbo.skupurchasedreport.Product_Id                      , 
       dbo.skupurchasedreport.totalprice_date1                     , 
       dbo.skupurchasedreport.totalprice_date2                     , 
       dbo.skupurchasedreport.qtypurchased_date1                    , 
       dbo.skupurchasedreport.qtypurchased_date2                    , 
       dbo.skupurchasedreport.totalprice_date3                     , 
       dbo.skupurchasedreport.qtypurchased_date3                    , 
       dbo.INV_dropshippers_To_ProductOptions.quantity AS currentqty 
FROM   dbo.Products 
       INNER JOIN dbo.skupurchasedreport 
       ON    dbo.Products.Product_ID = dbo.skupurchasedreport.Product_Id 
       LEFT OUTER JOIN dbo.Options AS Options_2 
       RIGHT OUTER JOIN dbo.INV_dropshippers_To_ProductOptions 
       ON    Options_2.Opt_ID = dbo.INV_dropshippers_To_ProductOptions.option_id3 
       LEFT OUTER JOIN dbo.Options AS Options_1 
       ON    dbo.INV_dropshippers_To_ProductOptions.option_id2 = Options_1.Opt_ID 
       LEFT OUTER JOIN dbo.Options 
       ON    dbo.INV_dropshippers_To_ProductOptions.option_id1 = dbo.Options.Opt_ID 
       ON    dbo.Products.Product_ID       = dbo.INV_dropshippers_To_ProductOptions.product_id 
GROUP BY  dbo.skupurchasedreport.Product_Id     , 
       dbo.INV_dropshippers_To_ProductOptions.product_id , 
       dbo.Products.Product_ID        , 
       dbo.Products.ProductTitle       , 
       dbo.Products.thumbnail        , 
       dbo.Products.Smimage         , 
       dbo.INV_dropshippers_To_ProductOptions.sku   , 
       dbo.Products.Discontinued       , 
       dbo.Products.CloseOut        , 
       dbo.Products.Special         , 
       dbo.Products.Active         , 
       dbo.Products.location_id        , 
       dbo.INV_dropshippers_To_ProductOptions.dropshipper_id, 
       dbo.Products.season         , 
       dbo.Products.CustomField2       , 
       dbo.Products.pt_type         , 
       dbo.Products.PartNumber        , 
       dbo.Products.RetailPrice        , 
       dbo.skupurchasedreport.Product_Id     , 
       dbo.skupurchasedreport.totalprice_date1    , 
       dbo.skupurchasedreport.totalprice_date2    , 
       dbo.skupurchasedreport.totalprice_date1    , 
       dbo.skupurchasedreport.totalprice_date3    , 
       dbo.skupurchasedreport.qtypurchased_date1   , 
       dbo.skupurchasedreport.qtypurchased_date2   , 
       dbo.skupurchasedreport.qtypurchased_date3   , 
       dbo.INV_dropshippers_To_ProductOptions.quantity 

回答

1

如果你想每個產品ID一個結果,那麼你就必須只能通過產品編號參加MAX上的所有其它列,除了產品ID,然後組。這可能會導致其他問題,所以您需要了解後果,更重要的是瞭解數據的性質。

3

你真的想組團嗎?一般來說,當我看到表中幾乎每列都有某種聚合和組的SQL語句時,這表明它可能是錯誤的。它可能會爲今天返回正確的數據,但明天是另一回事。請閱讀DISTINCT,Group By和Inner Queries以正確處理此問題。發佈這個問題的正確方法是從表中給我們一些數據,並給我們你想要的結果或期望的結果。我的傾向告訴我你想要某種

SELECT .. FROM .. INNER JOIN (SELECT ...)...GROUP BY SomeField 
+0

呵呵,我甚至沒有看到彙總 – 2010-01-05 15:13:09

+0

@達米爾 - 我通常說當我看到有人寫這樣的查詢時,包括一個它可能包括SUM,AVG等聚合。你可以從這個查詢的外觀中知道它是錯誤的。海報正在使用DISTINCT,但由於太多的字段而導致分組。這是一個不理解GROUP BY/Distinct工作方式的問題。 – JonH 2010-01-05 15:50:07

+0

@JonH,同意了。 – 2010-01-05 15:58:46

0

我會盡力解釋技術,但會留給你解決你的查詢。

讓我們先從一個表:

DECLARE @tbl TABLE (Id int, Color varchar(10)) 

INSERT INTO @tbl 
     (Id, Color) 
SELECT 1 ,'BLUE' UNION 
SELECT 2 ,'BLUE' UNION 
SELECT 3 ,'RED' UNION 
SELECT 4 ,'GREEN' UNION 
SELECT 5 ,'GREEN' UNION 
SELECT 6 ,'GREEN' UNION 
SELECT 7 ,'YELLOW' UNION 
SELECT 8 ,'YELLOW'; 

現在我想列出每種顏色的只有一個項目(類似於您的問題)

WITH abcd 
     AS (SELECT Id 
        ,Color 
        ,ROW_NUMBER() OVER (PARTITION BY Color ORDER BY Id) AS rn 
      FROM @tbl 
      ) 
    SELECT Id ,Color 
    FROM abcd 
    WHERE rn = 1 

返回

Id   Color 
----------- ---------- 
1   BLUE 
4   GREEN 
3   RED 
7   YELLOW 
相關問題