我有一个问题是从SQL查询中获取结果。我需要两个where子句的结果。我使用SQLServer2014
table1:产品
ProductID
1
2
3
4
5
表2:供应商
SupplierID
1
2
3
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
我想要的结果是当我设置:
其中(ProductID< 4)和(SupplierID = 2)
我必须得到结果:ProductID 4下的所有产品都与SupplierID 2相关,如果Product_Supplier中不存在,我必须得到Reference = Null
ProductID|SupplierID|Reference
1 |2 |Ref002
2 |2 |Null
3 |2 |Ref004
我启动了一些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
来自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
在这个脚本上,我无法在其中注入添加运行时代码。当我可以设置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
我将在真实数据库中对此进行测试。
答案 0 :(得分:5)
您需要首先获得Product
和Supplier
的所有组合。通过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
答案 1 :(得分:0)
试试这个:
SELECT ps.ProductSupplierID, s.SupplierID, ps.Reference
FROM Product_Supplier ps
LEFT JOIN Product p ON ps.ProductID = p.ProductID
LEFT JOIN Supplier s ON ps.SupplierID = s.SupplierID
WHERE p.ProductID < 4
AND s.SupplierID = 2
您可以使用INNER JOINs
代替LEFT JOINS,但首先尝试使用LEFT JOINS
,如果可行,请尝试INNER JOINs
进行试用。由于我相信Null
,您无法获得JOINs
值。
修改强>
上面的查询应该可以为您提供正确的结果。您需要检查并确保您确实拥有属于您认为自己所属类别的记录。首先逐行删除一些WHERE
子句。当您删除该子句的一行并显示该记录时,您知道您已找到该错误。
答案 2 :(得分:0)
标准中的问题是JSONObject obj;
try (InputStream input = new FileInputStream(pathname)) {
obj = new JSONObject(new JSONTokener(input));
}
。因为b(Suplier)引用c(链接表),如果c中不存在记录,它会否定b中的左连接。
您可以将标准移动到连接:
b.SupplierID = 2
由于不需要select a.ProductID, b.SupplierID, C.Reference from Product as a
join Supplier as B on b.SupplierID = 2 -- moved criterium
left join Product_Supplier as c on c.ProductID= a.ProductID and c.SupplierID=b.SupplierID
where a.ProductID<4
的明确数据,您也可以完全省略该加入并硬编码&#39; 2&#39;取而代之的是选择部分(同时将其作为连接中的额外标准)
supplier