Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-将多个列值从一行复制到另一行,但有例外_Sql_Ms Access - Fatal编程技术网

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

我有一个与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       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)

我知道还有其他类似的问题:

。。。然而,我不清楚如何将其应用于我想要的内容,不包括复制ID、Del和Cat。此外,在其他问题中给出的例子中,只有少数几个专栏——但我有40多个专栏。我不确定是否有一种“一刀切”的方式可以在所有栏目中复制,而不包括几个栏目,或者我是否必须将所有栏目都单独写出来(我不想复制的除外)

基本上,我知道会是这样的:

更新[TABLENAME]集合(但选择除ID、Del之外的所有字段 和Cat),其中User=“F”

。。。然而,由于这只是一个示例,使用用户“F”,我不想在硬代码中指定单个用户。我希望这适用于所有用户,无论名称如何。基本上,逻辑是:

查看C类别中具有Deleted=True标志的所有行。然后,对于任何已删除的C行,检查是否在任何其他类别(S或M)中存在相同的用户名。对于任何已找到的,请将数据从已删除记录的其余列复制到未删除记录-尽管不要复制类别、已删除或ID值


我希望这是清楚的。感谢你们这些经验丰富的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直接写入。不知道这是否有什么不同?只是尝试了一下-效果很好!非常感谢你。