SQL - 将多个列值从一行复制到另一行,异常

时间:2018-04-01 16:17:55

标签: sql ms-access

我有一个与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人员的帮助!

1 个答案:

答案 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。

中的值更新类别

我不确定语法是否正确,但我希望它无论如何都可以帮助你