【问题标题】:SQL replace value in a field in a row if it exists, else create a row and populate that valueSQL 替换行中字段中的值(如果存在),否则创建一行并填充该值
【发布时间】:2013-08-11 02:32:43
【问题描述】:

我的要求有点奇怪和具体,请多多包涵。

我有一个 Access 2003 数据库,其中有一个 Comments 表,其中有几十万行。有几个字段 - 我们称它们为 A, B, C, Dcomment。列A-C 构成表的PK。因此,您可以有 5、10 或 50 行具有不同的 cmets,但都属于 A-C PK。

我有另一个名为 CORE 的表,其中包含一个表 core,其中包含字段 A, B, C, D (A-C PK) 和 comment_value_insert

我想做什么:

Comments 中,对于相同A-C 行的每个“集合”(字段D 可以不同),如果它们的comment 值都不匹配某个值(我们称之为critical),那么在CORE 中查找同一行并在comments 表中插入一个带有A-DComments.comment = core.comment_value_insert 的新行。

我什至不确定这是否可以使用 SQL(也许是 VBA?因此是标签)。有什么建议吗? 如需进一步说明,请询问。

提前非常感谢。

编辑

准确地展示我想要的:

如果我的Comments 表看起来像

A | B | C | D | Comment
1   2   3   b   val1
1   2   3   x   val2
1   2   3   a   val3
2   9   8   z   val4
2   9   8   a   val5
3   3   3   x   val6
END

我的CORE 表看起来像

A | B | C | D | Comment_value_insert
1   2   3   u   critical1
2   9   8   t   critical2
4   8   6   x   critical3
END

然后我希望将CORE 中的critical1 行插入Comments 以及critical2 行,但不是critical3 行。

那么Comments表中的最终产品将是

A | B | C | D | Comment
1   2   3   b   val1
1   2   3   x   val2
1   2   3   a   val3
1   2   3   u   critical1
2   9   8   z   val4
2   9   8   a   val5
2   9   8   t   critical2
3   3   3   x   val6
END

【问题讨论】:

  • 所以您想在 SQL 或 Access 中执行此操作?
  • 如果每个 A-D“集”可以有多个评论,那么 A-D 就不是 Comments 表的 PK。假设 A-D+comment 或 A-D,commentID 是,对吗?此外,您问题的标题谈到了替换值,并且仅在该行不存在时才创建该行,但您在问题的正文中没有说任何内容。
  • 另一个问题:查询应该在“评论”表的哪个位置查找“评论”字段中的值“关键”?这是一个静态值吗?还是应该查找 core.comment_value_insert 字段中包含的值?如果您查找像“Critical”这样的静态值,并且“Core”表中的对应值是“Hello”,则查询将尝试插入新记录 A,B,C,D,"Hello " 每当您调用它时,因为这不会改变“评论”表中没有 A、B、C、D、“关键”记录的情况。对吗?
  • @twoleggedhorse 在这种情况下两者会相同吗?我正在使用 Access 2003,我认为有一个 SQL 解决方案来解决这个问题
  • @Clon 啊,是的,我的错 - 假设 D 是,就像评论字段也不是 PK。在“评论”表中,查询应该查看“评论”字段中是否存在值“关键”——该字段是静态的。如果“cmets”字段不包含整个 A-C 行集的“关键”值,则从 CORE 复制带有 comment_value_insert 值(这将是“关键”)的行。希望这更有意义。

标签: sql ms-access vba ms-access-2003


【解决方案1】:

对 INSERT 部分尝试类似的操作。对于 UPDATE 部分,您应该提供更多信息。

-- 编辑--

INSERT INTO Comments ( A, B, C, D, Comment )
SELECT DISTINCT C.A, C.B, C.C, C.D, C.comment_value_insert
FROM Core AS C INNER JOIN Comments as C1 ON C.A = C1.A and C.B = C1.B and C.C = C1.C
WHERE NOT EXISTS (SELECT * FROM Comments AS O WHERE O.Comment = "Critical" AND O.A = C.A AND O.B = C.B AND O.C = C.C);

问候,

【讨论】:

  • 这似乎解决了我的大部分问题(让我们暂时忘记更新 - 我可以让查询离开这些行)。现在的问题是查询似乎正在从 CORE 返回值,而这些值实际上并不存在于 Comments 表中。目前我的 Comments 表有 3212 行,而 CORE 表有 27132 行。您的查询将返回 26314。
  • 嗯,这很重要。我进行了查询,以便它插入 Comments 表中不存在的记录。我添加了一个 JOIN 子句以确保密钥 (A,B,C) 以前存在于 cmets 表中。我认为它现在应该可以工作了。
  • 很抱歉延迟回复您 - 我一直在旅行。这行得通;谢谢!
【解决方案2】:

** 这个版本对我有用 **

INSERT INTO comments  
SELECT a, 
       b, 
       c, 
       d, 
       comment_value_insert AS comment  
FROM   core  
WHERE  EXISTS (SELECT comments.*  
               FROM   comments  
               WHERE  core.c = comments.c  
                      AND core.b = comments.b  
                      AND core.a = comments.a)  
       AND NOT EXISTS (SELECT comments.*  
                       FROM   comments  
                       WHERE  core.c = comments.c  
                              AND core.b = comments.b  
                              AND core.a = comments.a  
                              AND core.comment_value_insert = comments.comment)   

【讨论】:

  • 我不确定这最终会达到我想要的效果 - 无论我如何修改它都会引发很多错误......请查看我编辑的问题以获取实际示例
猜你喜欢
  • 2021-10-22
  • 2021-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-17
  • 2020-06-25
  • 1970-01-01
相关资源
最近更新 更多