SQL-将多个列值从一行复制到另一行,但有例外
我有一个与Access兼容的数据库(JET engine、.mdb文件),我通过Excel中的VBA操作该数据库。查询和更新由VBA用SQL编写 我需要根据特定的条件将值从一行复制到另一行。让我举个例子:SQL-将多个列值从一行复制到另一行,但有例外,sql,ms-access,Sql,Ms Access,我有一个与Access兼容的数据库(JET engine、.mdb文件),我通过Excel中的VBA操作该数据库。查询和更新由VBA用SQL编写 我需要根据特定的条件将值从一行复制到另一行。让我举个例子: ID Del Cat User Col1 Col1 Col3 Col4 ... Col40 1 False M A xyz NULL NULL xyz ... xyz 2 True M B
ID Del Cat User Col1 Col1 Col3 Col4 ... Col40
1 False M A xyz NULL NULL xyz ... xyz
2 True M B NULL NULL NULL NULL ... xyz
3 False C C NULL xyz NULL NULL ... xyz
4 False C D xyz NULL NULL xyz ... xyz
5 False C E NULL NULL NULL NULL ... NULL
6 True C F xyz xyz NULL NULL ... xyz
7 False S G xyz xyz NULL xyz ... NULL
8 False S H NULL NULL xyz NULL ... NULL
9 False S F NULL NULL NULL NULL ... NULL
10 False S J xyz NULL NULL xyz ... NULL
ID是一个自动递增主键。
Del是一个布尔值,指示记录是否已标记为已删除(软删除)
Cat是记录的类别。存在3类:M、C、S
让我们看看第6行和第9行。它们都与用户“F”有关,但属于不同的类别(C和S)。但是,Cat C中的行已标记为已删除(Del=True),而S未删除(Del=False)
我要做的是更新第9行(用户“F”的未删除记录),以便从第6行复制所有实质性数据列(Col1..Col40)的值。我希望第9行最后看起来像这样:
9 False S F xyz xyz NULL NULL ... xyz
i、 e:除ID外,与第6行相同;Del标志(第6行保持为真,第9行保持为假);和Cat列(第6行保持C,第9行保持S)
我知道还有其他类似的问题:
我希望这是清楚的。感谢你们这些经验丰富的SQL人员的帮助 我想您需要将每个删除的行自动加入到要复制到的相应行中(类别S或M,用户名与删除的行相同)。这样,您就可以进行更新了。我不认为有一个简单的方法来计算所有40列。。。你必须把它们都写下来 我不熟悉access SQL,但请看一下此更新:
UPDATE table1 t
INNER JOIN table1 u
ON t.User = u.User
SET u.Col1 = t.Col1,
u.Col2 = t.Col2,
u.Col3 = t.Col3,
u.Col4 = t.Col4,
u.Col5 = t.Col5,
...
u.Col38 = t.Col38,
u.Col39 = t.Col39,
u.Col40 = t.Col40
WHERE t.Cat = 'C'
AND t.Del = 'True'
AND u.Cat IN ('M', 'S')
AND u.Del = 'False'
它将删除的行(t)与一个或多个对应的类别(u)连接起来。此时,可以使用t中的值更新类别
我不确定语法是否正确,但我希望它能对您有所帮助我想您需要将每个已删除的行自动加入到要复制到的相应行中(类别S或m,用户名与已删除行相同)。这样,您就可以进行更新了。我不认为有一个简单的方法来计算所有40列。。。你必须把它们都写下来 我不熟悉access SQL,但请看一下此更新:
UPDATE table1 t
INNER JOIN table1 u
ON t.User = u.User
SET u.Col1 = t.Col1,
u.Col2 = t.Col2,
u.Col3 = t.Col3,
u.Col4 = t.Col4,
u.Col5 = t.Col5,
...
u.Col38 = t.Col38,
u.Col39 = t.Col39,
u.Col40 = t.Col40
WHERE t.Cat = 'C'
AND t.Del = 'True'
AND u.Cat IN ('M', 'S')
AND u.Del = 'False'
它将删除的行(t)与一个或多个对应的类别(u)连接起来。此时,可以使用t中的值更新类别
我不确定语法是否正确,但我希望它能对您有所帮助我想您需要将每个删除的行自动加入到要复制到的相应行中(类别S或m与删除的行具有相同的用户名)。这样,您就可以进行更新了。我不认为有一个简单的方法来计算所有40列。。。你必须写下来all@AlexZen-谢谢。你能在回答中给出一些示例代码吗?我刚刚做了。希望有帮助!我想您需要将每个删除的行自动加入到要复制到的对应行中(类别S或M,其用户名与删除的行相同)。这样,您就可以进行更新了。我不认为有一个简单的方法来计算所有40列。。。你必须写下来all@AlexZen-谢谢。你能在回答中给出一些示例代码吗?我刚刚做了。希望有帮助!这不是有效的访问语法。在Access中,更新查询从不包含来自的
。相反,表和联接是在更新之后直接指定的
@ErikvonAsmuth谢谢,我在另一个问题上看到了这种语法,我认为这是在access上执行此操作的正确方法。现在应该正确了,谢谢。我的工作笔记本电脑现在不工作,所以我不能检查,但我会在周二检查,并让你知道它是否工作!顺便说一下,我实际上根本没有使用MS Access。它只是一个.mdb文件,通过Excel VBA中的ADO连接使用SQL直接写入。不知道这是否有什么不同?只是尝试了一下-效果很好!非常感谢。这不是Access的有效语法。在Access中,更新查询从不包含来自
的。相反,表和联接是在更新之后直接指定的
@ErikvonAsmuth谢谢,我在另一个问题上看到了这种语法,我认为这是在access上执行此操作的正确方法。现在应该正确了,谢谢。我的工作笔记本电脑现在不工作,所以我不能检查,但我会在周二检查,并让你知道它是否工作!顺便说一下,我实际上根本没有使用MS Access。它只是一个.mdb文件,通过Excel VBA中的ADO连接使用SQL直接写入。不知道这是否有什么不同?只是尝试了一下-效果很好!非常感谢你。