2010-01-05 76 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