查询不到数据如何显示为0
本帖最后由 wdxgdiy 于 2013-07-23 14:52:19 编辑
礼物表:SQL 查询 疑难
id name
1 黄瓜
2 西红柿
3 西瓜
持有表:
id 用户名 礼物id 数量
1 张三 1 3
想根据所有礼物查询某人持有数量
where name='张三'
用户名 礼物名 数量
张三 黄瓜 3
张三 西红柿 0
张三 西瓜 0
where name='李四'
用户名 礼物名 数量
李四 黄瓜 0
李四 西红柿 0
李四 西瓜 0
DECLARE @name SYSNAME
SET @name = '张三'
;WITH tb1(id,NAME)
AS
(
SELECT 1,'黄瓜'
UNION ALL
SELECT 2,'西红柿'
UNION ALL
SELECT 3,'西瓜'
),
tb2(id,用户名,礼物id,数量)
AS
(
SELECT 1,'张三',1,3
)
SELECT 用户名 = isnull(tb2.用户名,@name),礼物名 = tb1.name,数量 = isnull(tb2.数量,0) FROM tb1 LEFT JOIN tb2 on tb1.id = tb2.礼物id
AND tb2.用户名= @name
用户名礼物名数量
张三黄瓜3
张三西红柿0
张三西瓜0
DECLARE @name SYSNAME
SET @name = '李四'
;WITH tb1(id,NAME)
AS
(
SELECT 1,'黄瓜'
UNION ALL
SELECT 2,'西红柿'
UNION ALL
SELECT 3,'西瓜'
),
tb2(id,用户名,礼物id,数量)
AS
(
SELECT 1,'张三',1,3
)
SELECT 用户名 = isnull(tb2.用户名,@name),礼物名 = tb1.name,数量 = isnull(tb2.数量,0) FROM tb1 LEFT JOIN tb2 on tb1.id = tb2.礼物id
AND tb2.用户名= @name
用户名礼物名数量
李四黄瓜0
李四西红柿0
李四西瓜0
If not object_id('[礼物表]') is null
Drop table [礼物表]
Go
Create table [礼物表]([id] int,[name] nvarchar(3))
Insert [礼物表]
Select 1,N'黄瓜' union all
Select 2,N'西红柿' union all
Select 3,N'西瓜'
Go
--Select * from [礼物表]
If not object_id('[持有表]') is null
Drop table [持有表]
Go
Create table [持有表]([id] int,[用户名] nvarchar(2),[礼物id] int,[数量] int)
Insert [持有表]
Select 1,N'张三',1,3
Go
--Select * from [持有表]
select a.id,a.name,SUM(ISNULL(b.数量,0)) 数量
from [礼物表] a
left join [持有表] b
on a.id=b.礼物id
and b.用户名='张三'
group by a.id,a.name
/*
id name 数量
----------- ---- -----------
1 黄瓜 3
3 西瓜 0
2 西红柿 0
(3 行受影响)
*/
select a.id,a.name,SUM(ISNULL(b.数量,0)) 数量
from [礼物表] a
left join [持有表] b
on a.id=b.礼物id
and b.用户名='李四'
group by a.id,a.name
/*
id name 数量
----------- ---- -----------
1 黄瓜 0
3 西瓜 0
2 西红柿 0
(3 行受影响)
*/