SQL-从两个不同的表中选择值
我在从两个不同的表中选择值时遇到问题。下表: 材料:SQL-从两个不同的表中选择值,sql,sql-server,tsql,join,group-by,Sql,Sql Server,Tsql,Join,Group By,我在从两个不同的表中选择值时遇到问题。下表: 材料: MaterialID | MaterialName ------------------------- 1111111 | Material1 2222222 | Material2 3333333 | Material3 股票: MaterialID | Location | Quantity --------------------------------- 1111111 | LocA | 10 111
MaterialID | MaterialName
-------------------------
1111111 | Material1
2222222 | Material2
3333333 | Material3
股票:
MaterialID | Location | Quantity
---------------------------------
1111111 | LocA | 10
1111111 | LocB | 20
2222222 | LocC | 15
2222222 | LocD | 10
我的SQL查询如下:
SELECT
[Material].[MaterialName] as 'Material Name',
custom.quantity as 'Total Quantity',
FROM
[Material]
inner join (
SELECT
[MaterialId] as 'Materialcode',
SUM([Quantity]) as 'Quantity'
from
[Stock]
group by
[MaterialId]
) custom
on
custom.Materialcode = [Material].[MaterialId]
结果是:
Material Name | Total Quantity
------------------------------
Material1 | 30
Material2 | 25
问题是结果中没有关于Material3的信息(我知道数量等于0,因为它不在库存表中,但我需要一个结果来显示所有的材料-如下所示:
Material Name | Total Quantity
------------------------------
Material1 | 30
Material2 | 25
Material3 | 0
有可能吗?您可以
左侧加入并聚合:
select m.materialName, coalesce(sum(s.quantity), 0) total_quantity
from material m
left join stock s on s.materialID = m.materialID
group by m.materialID, m.materialName
您还可以进行聚合,然后左连接
(这是您最初的尝试,您只需要更改连接类型)
实际上,您也可以使用一个相关的子查询-在股票(实物,数量)
上有一个索引,这可能是一个有效的解决方案(这里您不需要coalesce()
):
另一种表达方式是使用横向连接:
select m.materialName, s.total_quantity
from material m
outer apply (select sum(quantity) total_quantity from stock s where s.materialID = m.materialID) s
您可以左连接
并聚合:
select m.materialName, coalesce(sum(s.quantity), 0) total_quantity
from material m
left join stock s on s.materialID = m.materialID
group by m.materialID, m.materialName
您还可以进行聚合,然后左连接
(这是您最初的尝试,您只需要更改连接类型)
实际上,您也可以使用一个相关的子查询-在股票(实物,数量)
上有一个索引,这可能是一个有效的解决方案(这里您不需要coalesce()
):
另一种表达方式是使用横向连接:
select m.materialName, s.total_quantity
from material m
outer apply (select sum(quantity) total_quantity from stock s where s.materialID = m.materialID) s
在查询中使用left join
和nvl(custom.quantity)作为“总量”
。在查询中使用left join
和nvl(custom.quantity)作为“总量”
。