TSQL-JOIN: отображать несуществующие значения в одной таблице как ноль в Join - PullRequest
1 голос
/ 08 апреля 2019

У меня есть две таблицы:

ProjectProduct (два идентификатора для проекта и продукта) и

ProductStatus (который содержит оценки качества для продуктов).

Таблица: ProjectProduct

| productID | projectID |
| --------- | --------- |
| 39        | 26        |
| 40        | 26        |
| 41        | 26        |
| 42        | 26        |

Таблица: ProductStatus

| 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 нет нет соответствующей записи .

только в приведенном выше примере productID 39существует в обеих таблицах.Чтобы отобразить все идентификаторы продукта, выходные данные должны содержать нулевое значение в столбце «Статус» для идентификаторов продукта с 40 по 42. Это та часть, которую я не могу понять.Например, TypeStatus TypeID может содержать 1 или 2. TypeID 2 должен различаться между RatedBy, который может содержать 0 или 1. Нужен ли оператор таблицы или выбора для отражения всех возможных перестановок?

Также только строкас наибольшим идентификатором, сгруппированным по идентификатору проекта, productID, typeID, RatedBy следует выбирать там, где есть существующий рейтинг.

Желаемый вывод : enter image description here

Я также создал SQL Fiddle

Я надеюсь, что вы можете направить меня в правильном направлении.

Спасибо.

Ответы [ 2 ]

1 голос
/ 08 апреля 2019

Запрос

   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

Вывод Output

1 голос
/ 08 апреля 2019

вы можете использовать временную таблицу следующим образом:

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  
...