Sinisa Janjetovic Ответов: 1

Sql-запрос с 3 связанными таблицами, получить последнюю запись покупки для каждого продукта


У меня есть 3 таблицы SQL в одной базе данных:

Т1: Пользователи, с колонками: ИДЕНТИФИКАТОР | Имя пользователя | имя | фамилия
Столбец ID является первичным ключом
Т2: Покупки, с колонкой: IdBid | свойство ProductCode | PurchaserID | BidPrice | Биддейт
Столбец IdBid является первичным ключом
Код продукта является внешним ключом к Таблице 3 в столбце IdProduct
PurchaserID является внешним ключом к Таблице 1 в столбце ID
Т3: Продукты, с колонкой: IdProduct | значение ProductName | Характеристика намечаемой к выпуску | OpeningPrice
Столбец IdProduct является первичным ключом

Таблицы T1 и T3 не имеют никакого отношения.


У меня есть аукцион, и в покупках T2 у меня может быть много предложений по одному продукту, и каждое предложение-это новый рекорд в покупках T2. В C# я должен создать CollectionList (наследующий ObservableCollection), который должен иметь список последней записи для каждого продукта, и он должен иметь некоторый столбец из всех трех вышеупомянутых таблиц, как показано ниже:

Т3 свойство ProductCode | Т3 значение ProductName | Т3 Характеристика намечаемой к выпуску | Т3 OpeningPrice | Т2 PurchaserID | Т1 PurchaserName | Т2 BidPrice |



Как должен выглядеть SQL-запрос, чтобы получить это?

Заранее спасибо

Что я уже пробовал:

Много различных вариантов SQL - запросов я могу получить последнюю запись каждого продукта, но только для того, чтобы показать два столбца, но я не мог получить все столбцы, которые мне нужны.

1 Ответов

Рейтинг:
6

OriginalGriff

Вам нужно использовать соединение в сочетании с подзапросом, использующим GROUP BY.

Группа ПО будет агрегировать записи вместе по продукту, и вы можете выбрать код продукта и Макс(BidDate) для каждой записи:

SELECT ProductCode, MAX(BidDate) AS LastBidDate 
FROM Purchases 
GROUP BY ProductCode
Затем вы можете использовать его для извлечения остальной части строки ставок:
SELECT * FROM Purchases a
JOIN (SELECT ProductCode, MAX(BidDate) AS LastBidDate 
      FROM Purchases 
      GROUP BY ProductCode ) g
ON a.ProductCode = g.ProductCode AND a.BidDate = g.LastBidDate
Тогда это тривиальное соединение, чтобы добавить другую необходимую вам информацию.


Sinisa Janjetovic

Спасибо, я проверю его

OriginalGriff

Всегда пожалуйста!

Maciej Los

5ed!

Herman<T>.Instance

Ощ Грифф! Используйте функцию ROW_NUMBER для таких запросов. Он предназначен для таких вопросов БД.

Выберите ProductCode, BidPrice, BidDate
ОТ
(
Выберите функции row_number() над(раздел по код продукта, порядок BidDate на код продукта, BidDate убыв) как Rowno, код продукта, BidPrice, BidDate
от покупки
) как x
Где Rowno = 1

OriginalGriff

Это тоже сработает.
Я просто подумал, что для новичка группа мимо и присоединиться было более очевидно, что происходит.

Herman<T>.Instance

И то и другое добавляет к кривой обучения

OriginalGriff

Ха! Это SQL: у него есть "обучающая кирпичная стена", а не кривая, как у руководств MSDOS.

Вы когда-нибудь смотрели документы для PIVOT и UNPIVOT? :смеяться:

Herman<T>.Instance

вы когда-нибудь читали мою статью о динамическом повороте?

OriginalGriff

Я даже не знал, что он существует!

И я уже наполовину выпил свой первый кофе за день (сейчас 06:30), так что я не собираюсь читать его прямо сейчас, мой мозг убежит и спрячется на целый день, если я попытаюсь ... :смеяться: