Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-从两个不同的表中选择值_Sql_Sql Server_Tsql_Join_Group By - Fatal编程技术网

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)作为“总量”