TSQL-JOIN:在Join中将一个表中不存在的值显示为零

时间:2019-04-08 09:48:02

标签: sql-server tsql sql-server-2012

我有两个表:

ProjectProduct (两个ID,分别代表项目和产品)和

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       |

我需要连接这两个表,以便即使ProductStatus表中没有对应条目,ProjectProduct表中的每个产品也将显示状态值。

在上面的示例中,两个表中仅存在 productID 39。要显示所有productID,输出应在Status列中为40至42的产品ID包含零值。 这是我无法弄清楚的部分。例如,ProductStatus的TypeID可以包含1或2。必须将类型ID 2区分为可以包含0或1的RatingBy。我是否需要表或select语句来反映所有可能的排列?

在存在现有评分的情况下,也仅应选择ID最高的行(按projectID,productID,typeID,RatedBy分组)。

所需的输出enter image description here

我还创建了一个SQL Fiddle

希望您能引导我朝正确的方向前进。

谢谢。

2 个答案:

答案 0 :(得分:1)

您可以像这样使用临时表:

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  

答案 1 :(得分:1)

查询

   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