ACCESS 对两表不同的查找(多索引)

现有两张表。格式一样。一张新表一张旧表,新表中可能有增加、删除或修改的数据。前提是此表类似需求追踪,B为A的子需求。现在表变更时如果仅查找A的增加删除和A内容的修改我是会了的。SELECT 新表.[A ID], 新表.[A], llx([A ID],[A]) AS 备注FROM 新表WHERE (((新表.[A ID]) In (select ID from 旧表)));UNION ALLSELECT 新表.[A ID], 新表.[A], "新增" AS 备注FROM 新表WHERE (((新表.[A ID]) Not In (select [A ID] from 旧表)));UNION ALLSELECT 旧表.[A ID], 旧表.A,, "取消" AS 备注FROM 旧表WHERE (((旧表.[A ID]) Not In (select [A ID] from 新表))); Option Compare DatabasePublic Function llx(ID As String, A As Long) Dim jbA As Long jbA = DLookup("A", "旧表", "[A ID]= ✀" & ID & "✀") If A <> jbA Then llx = "更改" If A = jbA Then llx = "未更改"End Function但是如果是A没有增删改,但是B有了上述方法就不适用了。比如A ID 中序列为1的下边本来对应B ID的序列有1和2如果加入了B3在A1中,是无法识别出来B3是A1中新增加的,因为B3本已存在A3中。 我想可能需要将A分组并且对每组进行上述方法。但是对ACCESS不熟悉不太会做。麻烦高手帮忙!!感激。(A中的ID只是实例,实际可能更复杂,不是数字,比如是[A-001])学校开设不同兴趣班:有音乐、美术、体育。 张三可能上音乐的同时上美术类似:音乐 张三音乐 李四音乐 王五美术 张三美术 王五美术 赵六体育 李四体育 赵六体育 刘七大家重新报班。出现的可能是:删除了一个课程,增加了一个课程。每个课程上的人也可能增加、减少。音乐 张三音乐 王五体育 李四体育 赵六体育 刘七体育 张三计算机 张三计算机 李四计算机 赵六 这事想查询出变更类似于:音乐 张三 #不变音乐 李四 #退课音乐 王五 #不变美术 张三 #取消课程美术 王五 #取消课程美术 赵六 #取消课程体育 李四 #不变体育 赵六 #不变体育 刘七 #不变体育 张三 #新人计算机 张三 #新课计算机 李四 #新课计算机 赵六 #新课
2026年09月21日 18:26
有2个网友回答
网友(1):

这个问题表述的不是很清楚,像是考语文能力了!尝试理解如下:


回答问题前需要确定表结构。这里假定两张表结构分别为

新表(A ID,A)

旧表(B ID,B)


1)查询新表较之于旧表有变更的情况


要求选出“新表”中[A ID]字段与”旧表“中[B ID]字段存在交集的记录,并增加一个[备注]字段,此字段值只有两种状态——“更改”和“未更改”,判断的标准是同ID的情况下如果”新表“的字段[A]与”旧表“的字段[B]相同则返回”未更改“,反之返回”更改“(如果”旧表“的[B ID]有重复则只取其同ID的首条记录中的[B]做判断,这个原则与提问中的自定义判断函数IIX里引用DLookup函数的处理是一致的);

+ 选出”新表“中[A ID]字段与”旧表“中[B ID]字段无交集的记录,并增加一个[备注]字段,对于检索出来的记录此字段值只有一种状态——"新增" ;

+选出”旧表“中[B ID]字段与”新表“中[A ID]字段无交集的记录,并增加一个[备注]字段,对于检索出来的记录此字段值只有一种状态——"取消"。

SQL实现代码

select a.[A ID] as ID,a.A, iif(a.A=b.B1,"未更改","更改") as 备注 from 新表 a,
(select [B ID],first(B) as B1 from 旧表 group by [B ID])b 
where a.[A ID]=b.[B ID] 
union all 
select a.[A ID],a.A,"新增" from 新表 a where not exists(
select 1 from 旧表 b where b.[B ID]=a.[A ID]) 
union all 
select a.[B ID],a.B,"取消" from 旧表 a where not exists(
select 1 from 新表 b where b.[A ID]=a.[B ID]);


2)反过来,查询旧表较之于新表有变更的情况


要求选出“旧表”中[B ID]字段与“新表”中[A ID]字段存在交集的记录,并增加一个[备注]字段,此字段值只有两种状态——“更改”和“未更改”,判断的标准是同ID的情况下如果“旧表”的字段[B]与“新表”的字段[A]相同则返回“未更改”,反之返回“更改“(如果”新表“的[A ID]有重复则只取其同ID的首条记录中的[A]做判断);

+ 选出”旧表“中[B ID]字段与”新表“中[A ID]字段无交集的记录,并增加一个[备注]字段,对于检索出来的记录此字段值只有一种状态——"新增" ;

+选出”新表“中[A ID]字段与”旧表“中[B ID]字段无交集的记录,并增加一个[备注]字段,对于检索出来的记录此字段值只有一种状态——"取消"。

SQL实现代码

select a.[B ID] as ID,a.B, iif(a.B=b.A1,"未更改","更改") as 备注 from 旧表 a,
(select [A ID],first(A) as A1 from 新表 group by [A ID])b 
where a.[B ID]=b.[A ID] 
union all 
select a.[B ID],a.B,"新增" from 旧表 a where not exists(
select 1 from 新表 b where b.[A ID]=a.[B ID]) 
union all 
select a.[A ID],a.A,"取消" from 新表 a where not exists(
select 1 from 旧表 b where b.[B ID]=a.[A ID]);



上面的代码无需借助自定义函数,运行效率会高不少。如果我的理解不是你要的、或者接近但是需要补充,请追问,我再尝试调整相关代码。

网友(2):

我不知道是不是明白了你的意思
能否这样 两个表互相做一个左连接的查询,空值或者说用NZ(字段,“新增”)来显示出变化。