Преобразование запроса для просмотра или функции значения таблицы

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

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 

Это работает, если две таблицы имеют следующую структуру:

 Product - ProductID ProductVariant - ProductID, VariantID, Price 

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

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

 select ProductID , dbo.NewFunction(ProductID) from Product 

 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 

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

 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 

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

Что-то вроде этого?

 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 

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

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

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

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

Interesting Posts

Автономный скрипт для выполнения хранимой процедуры с параметрами и итерации по возвращенному набору записей

Автоматизация доставки журналов Scripting Log

Выберите только целые числа из столбца char, используя SQL Server

Когда создаются несколько планов выполнения?

Репликация в реальном времени базы данных SQL Server

Создание локальной базы данных во время выполнения с помощью Visual Studio

Как заменить значение строки в SQL Server?

Исключить нулевое значение во время полного внешнего соединения

Как найти второе значение внутри столбца

Триггеры запуска Sql Server с пустыми вставленными и удаленными таблицами

Как добавить только значения, которые заканчиваются на 's'?

Как вставить запись в несколько таблиц в базе данных

Запланированное выполнение кода для ведения операций с базами данных в SQL Server

Мои данные не сохраняются в моей базе данных – C # visual studio

к MSMQ или не к MSMQ? (или SQL-таблица в качестве очереди)

Давайте будем гением компьютера.