一道数据库面试题
有两张表
表一AAA
字段:
类别 库存数量
A 1000
B 5000
表二 BBB
类别 售出数量
A 100
B 200
A 200
B 300
用一条SQL语句查询出个类别的剩余数量
高手请指教....
------解决方案--------------------select ( AAA.库存数量-BBB. 售出数量) as sl from AAA,BBB where AAA.类别=BBB.类别
------解决方案--------------------select b.cname,b.cnum-c.cnum
from (select a.cname as cname,sum(a.cnum) as cnum
from test2 a
group by a.cname) c inner join test1 b on c.cname=b.cname
其中test1是你说的那个库存量表,test2是那个售出表,你把表名改下就成
------解决方案--------------------oracle实现:
查所有类别:
select a.类别,b.库存数量-nvl(b.售出数量,0)
from AAA a, (select c.类别,sum(c.售出数量) 售出数量 from BBB c group by(c.类别)) b
where a.类别=b.类别(+)
查某个类别:
select a.类别,b.库存数量-nvl(b.售出数量,0)
from AAA a, (select c.类别,sum(c.售出数量) 售出数量 from BBB c where c.类别=?) b
where a.类别=b.类别(+)
and a.类别=?
------解决方案--------------------C代表这个(select a.cname as cname,sum(a.cnum) as cnum
from test2 a
group by a.cname) 语句查询出来的结果集,on后面是内联接中的条件语句
------解决方案--------------------c 是select a.cname as cname,sum(a.cnum) as cnum from test2 a group by a.cname 这句话的结果,至于on的作用
举个例子:
假设a表和b表的数据是这样的。
a b
id name id stock
1 a 1 15
2 b 2 50
3 c
select * from a inner join b on a.id=b.id
这个语法是连接查询中的内连接,它产生的结果是
两个表相匹配的记录出现在结果列表中。
根据上面的表,出现的结果是这样的
a.id name b.id stock
1 a 1 15
2 b 2 50
----------------------------
select * from a,b where a.id=b.id
这个语法是内连接的另外一种写法,其执行结果与inner join 一样
--------------------------------
select * from a left/right join b on a.id=b.id
这个是外连接语法中的左外连接或右外连接
如果是左外连接的话,它将显示a表的所有记录,
select a.*,b.* from a left join b on a.id=b.id
查询的结果是这样的:
a.id name b.id stock
1 a 1 15
2 b 2 50
3 c null null
--------------------------------------------
如果是右外连接的话,它将显示b表的所有记录,
select a.*,b.* from a right join b on a.id=b.id
查询的结果是这样的:
a.id name b.id stock
1 a 1 15
2 b 2 50
------解决方案--------------------完全同意 freedom2001(天翔) 的SQL语句
------解决方案--------------------sql语句我差
------解决方案-------------------- select (aaa.库存数量-(sum(bbb.输出数量))) as num from aaa,bbb where aaa.类别=bbb.类别 group by 库存数量