我有两个表:
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分组)。
我还创建了一个SQL Fiddle
希望您能引导我朝正确的方向前进。
谢谢。
答案 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