Преобразовать запрос в представление или табличное значение - PullRequest
2 голосов
/ 03 ноября 2011

Я хочу получить самый дешевый вариант продукта для всех продуктов.Для одного продукта это легко, однако я не могу заставить себя делать это для всех и не хочу использовать курсор.

select top 1
    pv.VariantID
from
    ProductVariant pv
    inner join (select min(price) as Price from productvariant where ProductID = @ProductID) pr
        on pv.Price = pr.Price
where
    pv.ProductID = @ProductID

Это работает, если в 2 таблицах есть следующееструктура:

Product - ProductID
ProductVariant - ProductID, VariantID, Price

Я знаю, что вы можете сделать это, кто-нибудь знает как?

Это лучший способ превратить приведенный выше запрос в скалярную функцию и использовать ее?Так бы и стало:

select
    ProductID
    , dbo.NewFunction(ProductID)
from
    Product

Ответы [ 4 ]

3 голосов
/ 03 ноября 2011
SELECT ProductID, MIN(Price) MinPrice
FROM Product JOIN ProductVariant ON Product.ProductID = ProductVariant.ProductID
GROUP BY ProductID

Это дает вам минимальную цену.Если вам нужен VariantID, который идет с ним, вам нужно присоединиться еще раз - НО цена уникальна для VariantID?

SELECT VariantID, ProductID, MinPrice
FROM ProductVariant JOIN
     (SELECT ProductID, MIN(Price) MinPrice
     FROM Product JOIN ProductVariant ON Product.ProductID = ProductVariant.ProductID
     GROUP BY ProductID) min_price
     ON ProductVariant.ProductID = min_price.ProductID AND ProductVariant.Price = min_price.MinPrice

Если цена не уникальна для варианта, это не будет работать правильно -в частности, вы получите дубликаты.Если это произойдет, вы можете изменить его на:

SELECT MIN(VariantID) SmallestVariantID, ProductID, MinPrice
FROM ProductVariant JOIN
     (SELECT ProductID, MIN(Price) MinPrice
     FROM Product JOIN ProductVariant ON Product.ProductID = ProductVariant.ProductID
     GROUP BY ProductID) min_price
     ON ProductVariant.ProductID = min_price.ProductID AND ProductVariant.Price = min_price.MinPrice
GROUP BY ProductID, MinPrice

Это выберет наименьший идентификатор варианта из дубликатов.

2 голосов
/ 03 ноября 2011
select
    pv.ProductID
    , min(pv.VariantID)
from
    ProductVariant pv
    inner join (select min(price) as Price, ProductID from productvariant group by ProductID) pr
        on pv.ProductID = pr.ProductID
        and pr.Price = pv.Price
group by
    pv.ProductID

Это самое простое решение, которое я нашел.

1 голос
/ 03 ноября 2011

Как то так?

select  pv.VariantID
from    ProductVariant pv1
join    (select min(pv2.price) as Price from productvariant pv2 where pv2.ProductID = pv.ProductID) pr
        on pv1.Price = pr.Price
0 голосов
/ 03 ноября 2011

Если я правильно понимаю, у вас есть несколько продуктов, каждый со своими вариантами, и каждый вариант со своей ценой.

Если это так, я думаю

select p.ProductID, min(pv.Price)
from Product
  inner join ProductVariant pv on p.ProductID = pv.ProductID

будет самым простым запросом для получения результата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...