两表关键字比较(100分)

  • 主题发起人 主题发起人 david_king
  • 开始时间 开始时间
D

david_king

Unregistered / Unconfirmed
GUEST, unregistred user!
各位高手:
我有两个数据库表,属性都一样,如A(SHEET,SUFFIX,COMPONENT),B(SHEET,SUFFIX,COMPONENT),
但里面的数据不都相同,我要列出所有COMPONENT不相同的所有数据,如何实现?
谢谢!
 
select * from A where component not in (select component from B)
union
select * from B where component not in (select component from A)
 
select a.sheet, a.suffix, a.component as acomponent, b.component as bcomponent
from a, b
where (a.sheet = b.sheet) and (a.suffix = b.suffix) and (a.sheet <> b.sheet)
 
select a.*
from a.,b
where not exists( select * from a,b where a.component=b.component)
union
select b.*
from a,b
where not exists( select * from a,b where a.component=b.component)

 
SELECT *
FROM A
WHERE COMPONENT NOT IN (SELECT COMPONENT FROM B)
UNION
SELECT *
FROM B
WHERE COMPONENT NOT IN (SELECT COMPONENT FROM A)
 
您的问题不清楚,ComPonent相同,但其他两个字段可能不同,
需不需要列出?
假如不需要
select * from A where component not in (select component from B)
union
select * from B where component not in (select component from A)
可以实现,假如需要则麻烦一些,我建议,假如你使用三层结构,则不必讲究而只使用
一句实现,可以使用两句或多句实现,另外可以使用视图,然后使用distinct提取数据。
 
没记错的话,是这样吧:

select *
from a,b
where a.component not in (select component from b)
 
to ldaan3:
你一定记错了
 
各位高手:
我按照你们的做法,但由于我的两表的ITEM太多,计算时间太长,经常导致死机,
有没有更好的办法呢? 谢谢了.
 
要讲究速度的话,试试如下方法:
select *
into Table_1
from A
go

select *
into Table_2
from B
go

select A.*
into Table_3
from A, B
where A.KeyId = B.KeyId
go

delete Table_1
from Table_3
where Table_1.component = Table_3.component
go

delete Table_2
from Table_3
where Table_2.component = Table_3.component
go

insert into Table_1
select *
from Table_2
go

问题的关键是在最后一个SQL语句时,在表A与表B中主键不能是否会出现重复值,如果没有,
则整个SQL语句执行起来是很快的,唯一的问题是整个SQL语句不太好看
 
to david_king:
不明白你的需求,最好把你的表铁锅来,有些demo数据,并预期的结果,这样好给你解决!
 
:white83,
delete Table_1
from Table_3
where Table_1.component = Table_3.component

有这种sql吗?
 
SELECT *
FROM A LEFT OUTER JOIN B ON A.PK = B.PK
AND A.COMPONENT <> B.COMPONENT
关于比较不同偶一般这样做
 
我的表具体是这样的:
表BOM63331:
SHEET ITEM SUFFIX COMPONENT DESCRIPTION QTY
120 0006 313810356272 FAMILY BOARD 1000
121 3101 232224213684 RST MGL VR37 A 680K PM5 A 1000
121 3105 232220733109 RST FUSE NFR25H A 10R PM5 A 1000
表BOM63481:
SHEET ITEM SUFFIX COMPONENT DESCRIPTION QTY
120 0006 313810356271 FAMILY BOARD 1000
121 3101 232224213684 RST MGL VR37 A 680K PM5 A 1000
121 3105 232220733109 RST FUSE NFR25H A 10R PM5 A 1000
这两表,我用两个QUERY同时查寻COMPONENT在表BOM63331中不在BOM63481中,和在表BOM63481
不在BOM63331中,并把结果放在两个TDBGRID中显示,但我一运行,就资源耗尽,请高手指教,
谢谢!
 
to :nulk,
你的这种方法,如果是这样的结构:
A:
PK COMPONENT
1 a
2 b
B:
PK COMPONENT
1 b
2 c
就不能得到david_king要的结果!

to david_king:
你的问题如果按照我前面的方法作,造成资源耗尽,唯一的原因就是:
1、纪录数太多。
2、COMPONENT是字符串,比较操作会花费巨大资源。
不知你的BOM63331、BOM63481究竟是纪录什么?向是COMPONENT的目录,又像BOM中的表单。
如果是目录,不明白为何有两张表?
如果是表单,你应该把COMPONENT字段设计成COMPONENT_ID(用INT类型),并在COMPONENT_ID上建立索引,这样再作比较操作时性能会有很打提高!

要实现你的要求,只有前面我提供的方法才是最合理的,你只能从数据库设计的角度考虑提高。
 
To MikeZ:
忘了说上面的是当B的记录都在A中时候。
改一下:
SELECT *
FROM A [red]FULL[/red] OUTER JOIN B ON A.PK = B.PK
AND A.COMPONENT <> B.COMPONENT
建议没必要尽量不用子查询,太慢了
 
to nulk:
我知道用范围子查询,太慢!
但你的方法查:
PK COMPONENT
1 a
2 b
B:
PK COMPONENT
1 b
2 c
得出的结果是:
PK COMPONENT PK COMPONENT
1 a 1 b
2 b 2 c

david_king想要的只是COMPONENT 为a,c的结果吧?


 
MikeZ 说的对,太匆忙发贴了,再改
SELECT a.*, 'table_a' AS tablename
FROM a INNER JOIN b
ON b.pk = a.pk AND b.component <> a.component
UNION
SELECT b.*, 'table_b' AS tablename
FROM b INNER JOIN a
ON b.pk = a.pk AND b.component <> a.component
ORDER BY a.pk

得出的结果为
PK COMPONENT TABLENAME
1 a table_a
1 b table_b
2 b table_a
2 c table_b

就很容易区分两表的不同了。(或者在前台的Grid上用单双行不同颜色)
 

Similar threads

回复
0
查看
1K
不得闲
D
回复
0
查看
824
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
后退
顶部