我有一个与Access兼容的数据库(JET引擎,.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 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是一个布尔值,表示记录是否已标记为已删除(软删除) 猫是记录的类别。存在3个类别:M,C,S。
让我们看一下行ID 6& 9.它们都与用户" F"有关,但它们属于不同的类别(C和S)。但是,Cat C中的行已被标记为已删除(Del = True),而S未被删除(Del = False)。
我想要做的是更新第9行(用户" F"的未删除记录),以便从中复制所有实质性数据列(Col1 .. Col40)的值第6行。我希望第9行最终看起来像这样:
9 False S F xyz xyz NULL NULL ... xyz
即:除了ID之外与第6行相同; Del标志(第6行应保持为True,第9行应为False);和Cat列(第6行应为C,第9行应为S)。
我知道存在其他类似的问题:
...然而,我并不清楚如何将这个应用到我想要的内容,不包括复制ID,Del和Cat。另外,在其他问题中给出的例子中,只有少数几列 - 但我有40多个。我不确定是否有"毯子"复制所有列的方法,只排除一对,或者我必须单独写出所有这些(除了我不想复制的那些)。
基本上,我知道它会像:
UPDATE [TABLENAME] SET(但是要选择除ID,Del之外的所有字段 和猫)用户=" F&#34 ;;
...但是,这只是一个例子,使用User" F",我不想在硬代码中指定单个用户。我希望这适用于所有用户,无论名称是什么。基本上,逻辑是:
"使用Deleted = True标志查看C类别中的所有行。然后,对于任何已删除的C行,检查是否在任何其他类别(无论是S还是M)中存在相同的用户名。对于找到的任何内容,将其余列中的数据从已删除的记录复制到未删除的记录 - 尽管不要复制类别,已删除或ID值"。
我希望这很清楚。感谢那些经验丰富的SQL人员的帮助!
答案 0 :(得分:2)
我猜你需要将每个已删除的行自动连接到要复制到的相应行(类别为S或M,用户名与删除的行相同)。如你所知,你可以进行更新。我认为没有一种简单的方法可以统计所有40列...你必须全部写出来。
我不熟悉访问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。
中的值更新类别我不确定语法是否正确,但我希望它无论如何都可以帮助你