gpt4 book ai didi

sql-server - 使用 2 个 where 子句连接 3 个表,得到空结果

转载 作者:行者123 更新时间:2023-12-03 23:57:11 26 4
gpt4 key购买 nike

我在从 sql 查询中获取结果时遇到问题。我需要两个 where 子句的结果。我使用 SQLServer2014

表 1:产品

ProductID
1
2
3
4
5

表 2:供应商

SupplierID
1
2
3

表 3: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

在此脚本中,我无法将添加运行时代码注入(inject)到 where 代码中。当我可以在 sql 的末尾设置 where 时,最终用户可以注入(inject) 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

最后我会在真实数据库上测试这个。

最佳答案

您需要先获取ProductSupplier 的所有组合。通过执行 CROSS JOIN 来做到这一点。最后,对 Product_Supplier 表执行 LEFT JOIN:

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

ONLINE DEMO

关于sql-server - 使用 2 个 where 子句连接 3 个表,得到空结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39979728/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com