如何把两条查询语句合并在一起?

时间:2020-12-26 22:31:49
ADOQuery1查询结果如下:
-----------------------------
品名    车间领用出库数量
J40          3

ADOQuery2查询结果如下:
-----------------------------
品名    车间返回入库数量
J20          42
J40          1

我想把它们合并在一起,显示如下:

-----------------------------
品名 车间领用出库数量  车间返回入库数量   车间实际领用数量  
J40    3                1                    2
J20    0                42                   -42

如何实现?

10 个解决方案

#1


left join

#2


你可以这样做

 select A.品名 ,A.车间领用出库数量,B.车间返回入库数量,
       (A.车间领用出库数量-B.车间返回入库数量) as 车间实际领用数量
 from (生成ADOQuery1结果的SQL语句) A left join 
       (生成ADOQuery2结果的SQL语句) B on A.品名=B.品名

记住你的两个 ADOQuery结果集一定要用 Group by 品名进行过分组的才行

#3


劝楼主使用视图来实现比较好!要不然每次都要访问这些内容的时候,都要编译一下你的这个查询的语句!给你视图的语句:
SELECT dbo.[IN].品名, dbo.Out.数量 AS 车间领用出库数量, 
      dbo.[IN].数量 AS 车间返回入库数量, dbo.MyVal(dbo.Out.数量 - dbo.[IN].数量) 
      AS 车间实际领用数量
FROM dbo.[IN] FULL OUTER JOIN
      dbo.Out ON dbo.[IN].品名 = dbo.Out.品名

其中dbo.MyVal是自定义的函数,如下:
CREATE FUNCTION MyVal (@Val Smallmoney)
RETURNS Smallmoney  --用于我的类型判断!如果变量是null则返回的是0,如果变量非null则返回变量的值)
AS  
BEGIN
declare @MyR smallmoney
if @val=null
set @MyR=0
else
set @MyR=@Val
return @MyR
END

#4


还有个问题就是要是IN表没有相关的记录的时候是null的!
看楼主的问题,应该是做一个出入库的系统,劝楼主要设计好你的数据库,感觉你的数据库设计不太合理。

出入库主要有2个业务流程:1出库的记录添加修改删除。2:入库的记录添加修改删除。因此,In表的品名是很多重复的,同样的道理,out表的品名也是很多重复的,因为反应了出库和入库是不同时间的出入情况,而并不是反应一件物品只出一次或者只入一次。因此,楼主要设计的这个使用情况,应该用到统计函数count,count一个表里面的不同物品的合计数量,得出车间的实际使用量。还有就是,不要使用品名来联合,最好使用物品的标识来联合。做一个物品表。

没见过你的实际设计,我猜到的也只有这些,你可以参考一下!说得不对请指点一下!

#5



ADOQuery1和ADOQuery2中的品名其实是库存表中的品名,我上面所显示的只是查询后的一部分,入库表和出库表和库存表是通过库存表中的编号关联的.
ADOQuery1和ADOQuery2已经查询出来了,只要能把它们关联在一起显示出来就满足我的要求了,但是还要注意有出库没有入库或有入库没有出库的情况.

#6


回复人: lyBingYu(冰雨) ( ) 信誉:100 

你的我试了,如果同一品名的即有入库也有出库可以,但是如果有出库没有入库或有入库没有出库的就不行了.

#7


select A.品名 ,B.品名,A.车间领用出库数量,B.车间返回入库数量,
       (A.车间领用出库数量-B.车间返回入库数量) as 车间实际领用数量
 from (生成ADOQuery1结果的SQL语句) A full outer join 
       (生成ADOQuery2结果的SQL语句) B on A.品名=B.品名

我试过,如果这样的话就会有两个品名,能不能去掉一个?

#8


up

#9


select table1.1,table1.2,b.1,b.2 from table1  left join table2 b on b.1=table1.1

#10


回复人: chwdong(chwdong) ( ) 信誉:100 
能不能具体一点,不太明白.table1.1,table1.2是什么

#1


left join

#2


你可以这样做

 select A.品名 ,A.车间领用出库数量,B.车间返回入库数量,
       (A.车间领用出库数量-B.车间返回入库数量) as 车间实际领用数量
 from (生成ADOQuery1结果的SQL语句) A left join 
       (生成ADOQuery2结果的SQL语句) B on A.品名=B.品名

记住你的两个 ADOQuery结果集一定要用 Group by 品名进行过分组的才行

#3


劝楼主使用视图来实现比较好!要不然每次都要访问这些内容的时候,都要编译一下你的这个查询的语句!给你视图的语句:
SELECT dbo.[IN].品名, dbo.Out.数量 AS 车间领用出库数量, 
      dbo.[IN].数量 AS 车间返回入库数量, dbo.MyVal(dbo.Out.数量 - dbo.[IN].数量) 
      AS 车间实际领用数量
FROM dbo.[IN] FULL OUTER JOIN
      dbo.Out ON dbo.[IN].品名 = dbo.Out.品名

其中dbo.MyVal是自定义的函数,如下:
CREATE FUNCTION MyVal (@Val Smallmoney)
RETURNS Smallmoney  --用于我的类型判断!如果变量是null则返回的是0,如果变量非null则返回变量的值)
AS  
BEGIN
declare @MyR smallmoney
if @val=null
set @MyR=0
else
set @MyR=@Val
return @MyR
END

#4


还有个问题就是要是IN表没有相关的记录的时候是null的!
看楼主的问题,应该是做一个出入库的系统,劝楼主要设计好你的数据库,感觉你的数据库设计不太合理。

出入库主要有2个业务流程:1出库的记录添加修改删除。2:入库的记录添加修改删除。因此,In表的品名是很多重复的,同样的道理,out表的品名也是很多重复的,因为反应了出库和入库是不同时间的出入情况,而并不是反应一件物品只出一次或者只入一次。因此,楼主要设计的这个使用情况,应该用到统计函数count,count一个表里面的不同物品的合计数量,得出车间的实际使用量。还有就是,不要使用品名来联合,最好使用物品的标识来联合。做一个物品表。

没见过你的实际设计,我猜到的也只有这些,你可以参考一下!说得不对请指点一下!

#5



ADOQuery1和ADOQuery2中的品名其实是库存表中的品名,我上面所显示的只是查询后的一部分,入库表和出库表和库存表是通过库存表中的编号关联的.
ADOQuery1和ADOQuery2已经查询出来了,只要能把它们关联在一起显示出来就满足我的要求了,但是还要注意有出库没有入库或有入库没有出库的情况.

#6


回复人: lyBingYu(冰雨) ( ) 信誉:100 

你的我试了,如果同一品名的即有入库也有出库可以,但是如果有出库没有入库或有入库没有出库的就不行了.

#7


select A.品名 ,B.品名,A.车间领用出库数量,B.车间返回入库数量,
       (A.车间领用出库数量-B.车间返回入库数量) as 车间实际领用数量
 from (生成ADOQuery1结果的SQL语句) A full outer join 
       (生成ADOQuery2结果的SQL语句) B on A.品名=B.品名

我试过,如果这样的话就会有两个品名,能不能去掉一个?

#8


up

#9


select table1.1,table1.2,b.1,b.2 from table1  left join table2 b on b.1=table1.1

#10


回复人: chwdong(chwdong) ( ) 信誉:100 
能不能具体一点,不太明白.table1.1,table1.2是什么