У меня есть две таблицы:
ПроектПродукт (два идентификатора для проекта и продукта) и
Статус продукта (содержит оценки качества продуктов).
Таблица: ПроектПродукт
| productID | projectID |
| --------- | --------- |
| 39 | 26 |
| 40 | 26 |
| 41 | 26 |
| 42 | 26 |
Таблица: Статус продукта
| id | projectID | productID | typeID | Status | Comment | RatedBy |
| --- | --------- | --------- | ------ | ------ | ------------ | ------- |
| 1 | 26 | 39 | 2 | 30 | comm1 | 0 |
| 2 | 26 | 39 | 2 | 70 | comm2 | 0 |
| 22 | 26 | 39 | 1 | 70 | diff type | 0 |
| 3 | 26 | 39 | 2 | 100 | comm3 | 0 |
| 4 | 26 | 39 | 2 | 70 | diff ratedBy | 1 |
| 5 | 26 | 39 | 2 | 100 | comm5 | 0 |
| 6 | 26 | 39 | 2 | 30 | comm6 | 0 |
Мне нужно соединить эти две таблицы, чтобы каждый продукт в таблице ProjectProduct отображал значение статуса, даже если в таблице ProductStatus есть нет соответствующей записи.
В приведенном выше примере в обеих таблицах существует только идантификационный номер продукта 39. Чтобы отобразить все идентификаторы продуктов, выходные данные должны содержать нулевое значение в столбце «Статус» для идентификаторов продуктов с 40 по 42. Это та часть, которую я не могу понять. Например, TypeID ProductStatus может содержать 1 или 2. TypeID 2 следует отличать от RatedBy, который может содержать 0 или 1. Нужна ли мне таблица или оператор выбора для отражения всех возможных перестановок?
Также следует выбирать только строку с самым высоким идентификатором, сгруппированным по идентификатору проекта, идентификатору продукта, идентификатору типа, RatedBy, где существует существующий рейтинг.
Я также создал Скрипт SQL
Я надеюсь, что вы можете направить меня в правильном направлении.
Спасибо.
вы можете использовать временную таблицу следующим образом:
select Max(Id) maxID ,ProductId,ProjectId into #Temp1 from ProductStatus
where typeID=2 and RatedBy=0
group by ProductId,ProjectId
select * into #Temp2 from ProductStatus where Id In (select MaxId from #Temp1)
select p.ProjectId,p.ProductId, 2 as typeID,isnull(t.status,0) as Status,t.Comment,0 as RatedBy
from ProjectProduct p left join #Temp2 t on p.ProductId=t.ProductId and p.ProjectId=t.ProjectId
Запрос
SELECT ProjectProduct.projectID, ProjectProduct.productID, ProductStatus.typeid,ProductStatus.status,ProductStatus.Comment,ProductStatus.ratedBY
FROM ProjectProduct
left join
(
SELECT max(ID) id, productID,projectID
FROM ProductStatus
where typeID = 2
and ratedBY = 0
group BY productID,projectID ) maxproduct on ProjectProduct.productID = maxproduct.productID and ProjectProduct.projectID = maxproduct.projectID
left join ProductStatus on ProductStatus.id = maxproduct.ID
Спасибо. это самый простой (для меня) из всех примеров, и он работает очень хорошо.
Добро пожаловать! Хорошего дня.
Не могли бы вы написать желаемый результат?