我有一个问题,从SQL查询获得结果.我需要两个where子句的结果.我使用SQLServer2014
table1:产品
ProductID
1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)
表2:供应商
SupplierID
1
2
3
Run Code Online (Sandbox Code Playgroud)
table3:Product_Supplier
ProductSupplierID|ProductID|SupplierID|Reference
1 |1 |1 |Ref001
2 |1 |2 |Ref002
3 |2 |1 |Ref003
4 |3 |2 |Ref004
5 |4 |2 |Ref005
Run Code Online (Sandbox Code Playgroud)
我想要的结果是当我设置:
其中(ProductID <4)和(SupplierID = 2)
我必须得到结果:ProductID 4下的所有产品都与SupplierID 2相关,如果Product_Supplier中不存在,我必须得到Reference = Null
ProductID|SupplierID|Reference
1 |2 |Ref002
2 |2 |Null
3 |2 |Ref004
Run Code Online (Sandbox Code Playgroud)
我启动一些sql脚本,但我无法得到正确的结果
select a.ProductID, b.SupplierID, C.Reference from Product as a
left outer join Product_Supplier as c on c.ProductID= a.ProductID
left outer join Supplier as B on b.SupplierID = c.SupplierID
where a.ProductID<4 and b.SupplierID=2
Run Code Online (Sandbox Code Playgroud)
来自Felix Pamittan的回答:
SELECT
t.*,
ps.Reference
FROM (
SELECT *
FROM Product
CROSS JOIN Supplier
WHERE
ProductID < t.ProductID
AND SupplierID = t.SupplierID
) t
LEFT JOIN Product_Supplier ps
ON ps.ProductID = t.ProductID
AND ps.SupplierID = t.SupplierID
Run Code Online (Sandbox Code Playgroud)
在这个脚本上我不能注入添加运行时的代码.当我可以设置sql末尾的位置时,最终用户可以注入where参数.
SELECT
t.*,
ps.Reference
FROM (
SELECT *
FROM Product
CROSS JOIN Supplier
--WHERE
-- ProductID < t.ProductID
-- AND SupplierID = t.SupplierID
) t
LEFT JOIN Product_Supplier ps
ON ps.ProductID = t.ProductID
AND ps.SupplierID = t.SupplierID
where t.ProductID < 4
and t.SupplierID=2
Run Code Online (Sandbox Code Playgroud)
我将在真实数据库上测试这个.
你需要先获得Products和Suppliers的所有组合.通过做一个这样做CROSS JOIN.最后,LEFT JOIN在Product_Supplier桌子上做一个:
SELECT
t.*,
ps.Reference
FROM (
SELECT *
FROM #Product
CROSS JOIN #Supplier
WHERE
ProductID < 4
AND SupplieIrD = 2
) t
LEFT JOIN #Product_Supplier ps
ON ps.ProductID = t.ProductID
AND ps.SupplierID = t.SupplieIrD
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
104 次 |
| 最近记录: |