无法使用SQL Server获得预期的查询

时间:2013-09-26 20:24:45

标签: sql sql-server sql-server-2008 join

我正在尝试进行SQL查询但是我无法获得预期的结果。我真的不知道出了什么问题。

我有一个表Product,其中包含(product_id,title)和其他表Product_Variation,其中包含(product_variation_id,product_id,description,gender,price)

基本上,我有一个产品。对于每种产品,都有N种变体。

e.g

产品:标题“我不知道” Product_Variation:description“T-Shirt”,性别“男性”,价格“59.90”

我需要的是选择Product and Product_Variation,仅显示价格最低的产品。

我不在乎产品是否有T恤,夹克或其他任何变体。我只需要获得价格最低的变化。

我的查询是:

SELECT b.product_id, b.title, MIN(b.price) as price, b.gender

FROM (

        SELECT p.product_id, p.title, MIN(pv.price) AS price, pv.gender
        FROM products p
        join product_variation pv ON pv.product_id = p.product_id
        GROUP BY p.product_id, p.title, pv.price, pv.gender

    ) b     

GROUP BY b.product_id, b.title, b.price, b.gender

请参阅我的example in SQL Fiddle

谢谢!

3 个答案:

答案 0 :(得分:1)

由于您使用的是SQL 2008,因此可以使用ROW_NUMBER查找价格最低的行:

SELECT *
FROM products p
INNER JOIN 
(SELECT 
    product_id,
    Description,
    Gender,
    Price,
    ROW_NUMBER() OVER(PARTITION BY product_id ORDER BY price)  Row
FROM product_variation )
pv ON pv.product_id = p.product_id
AND Row = 1

如果您有两个价格相同的变体,您将获得一个随机行。

答案 1 :(得分:0)

您可以使用rank()窗口函数来命令分区(组)中的内容,但是给予相同的项目相同的等级:

;With b as (
    Select
        p.product_id,
        p.title, 
        pv.price,
        pv.gender,
        rank() over(partition by p.product_id order by pv.price) rk
    From
        products p
            Inner Join
        product_variation pv
            On pv.product_id = p.product_id
)
Select
  b.product_id, 
  b.title, 
  b.price,
  b.gender
From
  b
Where
  rk = 1

如果您只想要每件商品一件即使产品相同,请使用row_number()代替rank()

<强> Example Fiddle

答案 2 :(得分:0)

-- Solution #1
SELECT  *
FROM
(
SELECT  p.product_id, p.title, 
        pv.price, pv.gender,
        ROW_NUMBER() OVER(PARTITION BY p.product_id ORDER BY pv.price) AS row_num
FROM    products p
join    product_variation pv ON pv.product_id = p.product_id
) src
WHERE   src.row_num = 1

-- Solution #2
SELECT  p.product_id, p.title, 
        x.price, x.gender
FROM    products p
cross apply
(
        SELECT  TOP(1) pv.price, pv.gender
        FROM    product_variation pv 
        WHERE   pv.product_id = p.product_id
        ORDER BY pv.price
) x