当前位置:主页>销售管理软件> 列表

SQL语句问题:两个相同结构的表合并,去除重复部分。 找excel制作进销存

库存管理软件版1楼: 使用Access,有两个表:A和B,字段、结构完全相同
它们的字段如下:产品名称,出厂批次,出厂年份,生产厂,产品编号
每种产品只有靠:出厂批次,出厂年份,生产厂,产品编号 四个字段才能唯一标识。
现希望把这两个表合并成一个虚拟表,在DBGrid中显示。如果两个表存在出厂批次,出厂年份,生产厂,产品编号相同的产品,只显示一个即可。请问这样的SQL如何写?

2楼: select * from A
union
select * from B 如金蝶财务软件官网

3楼: SELECT A.出厂批次,A.出厂年份,A.生产厂,A.产品编号
FROM A
UNION
SELECT B.出厂批次,B.出厂年份,B.生产厂,B.产品编号
FROM B
WHERE NOT EXISTS(SELECT 1 FROM A AS AA WHERE
AA.出厂批次=B.出厂批次 AND AA.出厂年份=B.出厂年份 AND AA.生产厂=B.生产厂
AND AA.产品编号=B.产品编号)

4楼: 用这个就可以实现了
select * from A
union
select * from B

5楼: select * into #tmp from a
insert into #tmp select * from b
select distinct * from #tmp
[:D]

6楼: 我试验一下

库存管理软件版7楼: wwhnet: 你那个可以保证去除重复部分?

8楼: Txh2005:Distinct 是值所有的字段都不相同吧,我只是要求那几个字段的组合不同即可

9楼: babibean:你那个Select 1中的1是什么意思?

10楼: SELECT A.出厂批次,A.出厂年份,A.生产厂,A.产品编号


FROM A
UNION
SELECT B.出厂批次,B.出厂年份,B.生产厂,B.产品编号
FROM B
WHERE NOT EXISTS(SELECT 1 FROM A AS AA WHERE
AA.出厂批次=B.出厂批次 AND AA.出厂年份=B.出厂年份 AND AA.生产厂=B.生产厂
AND AA.产品编号=B.产品编号)

这个可以用,SELECT 1 FROM 不理解可以用SELECT * FROM

改正一下:
SELECT A.出厂批次,A.出厂年份,A.生产厂,A.产品编号
FROM tableA A
UNION
SELECT B.出厂批次,B.出厂年份,B.生产厂,B.产品编号
FROM tableB B
WHERE NOT EXISTS(SELECT 1 FROM tableA AS AA WHERE
AA.出厂批次=B.出厂批次 AND AA.出厂年份=B.出厂年份 AND AA.生产厂=B.生产厂
AND AA.产品编号=B.产品编号)

11楼: 因为你只要求部分字段不重,且键只要一行,直接union,是不行的.你用的是Access,那么你可以分几个查询来做,(分步你容易看得明)
1.新建查询:qt1 ;(两表中所有的键)
select col1 from testtable1 t1 UNION select col1 from testtable2 t2;
2.新建查询:qt2 ;(两表合并,但存在重复的键,如果键相其它字段不同)
select col1,col2 from testtable1 t3 UNION select col1,col2 from testtable2 t4;
3.新建查询:qtonekey (取出两表中合并后没有重复的键)


SELECT qt2.col1 FROM qt2 GROUP BY qt2.col1 HAVING (((Count(qt2.col1))=1));
4.新建查询: qtmorekey (两表中合并后重复的建)
SELECT qt2.col1 FROM qt2 GROUP BY qt2.col1 HAVING (((Count(qt2.col1))>1));
5.新建查询:qtresult1 (根据qtonekey得到明细的记录)
SELECT TOP 1 qt2.col1, qt2.col2 FROM qtmorekey LEFT JOIN qt2 ON qtmorekey.col1=qt2.col1;
6.新建查询:qtresult2 (根据qtmorekey得到明细的记录)
SELECT qt2.col1, qt2.col2 FROM qtonekey LEFT JOIN qt2 ON qtonekey.col1=qt2.col1;
7.新建查询:qtresult(合并qtresult1和qtresult2)

其中col1,是键字段,多个也是一样的,(可以把它们放在一起)
仔细看看,就明白了.
select * from qtresult1 UNION select * from qtresult2;

12楼: 关键第5步,如果没有使用top 1,那么当两表中相同的键记录,其它字段有不同值,则会产生多条.也就是直接union会产生重复的原因 如excel制作进销存

13楼: babibean,的方法,是把B表的=A表的键其它字段有不同值的记忽略了,(简洁也很好)
如果分步,可以在第5步中处理:SELECT TOP 1 qt2.col1, qt2.col2 FROM qtmorekey LEFT JOIN qt2 ON qtmorekey.col1=qt2.col1;
例如把其它字段合并起来,等.

库存管理软件版14楼: 搞定,多谢各位!散分!