【问题标题】:ACCESS/SQL: How to INSERT INTO/UPDATE at the same time?ACCESS/SQL:如何同时插入/更新?
【发布时间】:2011-01-12 10:32:31
【问题描述】:

这是我的情况。 首先,我不是在研究关系数据库,我只是将访问作为一种操作数据的简单方法。 目前,我有很多桌子。
一个主表,我们称之为 MAIN,大约 10 个其他表,我们可以称之为 X1、X2、X3 等。 X1 表包含具有 X1 属性的项目。 X2 表包含具有 X2 属性的项目,依此类推。

所有 Xx 表都有相同的字段。 MAIN 表也有相同的字段,此外还有字段 X1、X2 等,它们是布尔值。

我想做的事:

我想向 MAIN 表提供 Xx 表中的数据。
问题是,可能存在具有多个属性的项目,因此它们可以出现在例如 X1、X2、X5 中。

所以我一开始尝试运行这个:

UPDATE MAIN
SET itemnumber = X1.itemnumber, x1 = "true";

但它什么也没给。现在我想这只是合乎逻辑的,因为 MAIN 表中还没有任何记录。

无论如何,我可以写什么查询来做到这一点:
如果 MAIN 中还没有表 X1 的记录,则添加它并将 X1 字段设置为 true。
如果 MAIN 中已经存在 X1 的记录,则更新它并将 X1 字段设置为 true。

(然后我会更新它以在我拥有的每个 X 表上运行。)

我正在考虑 INSERT INTO,但我不想覆盖已经存在的数据或产生错误(我真的不太了解这一切>_>)

提前感谢任何可以提供提示的人。

编辑 1
我以为我会先尝试将 Xx 表中的所有数据插入到 MAIN 表中(它们具有相同的结构)

所以我一开始尝试了这个:

INSERT INTO MAIN.itemnumber
(select X1.itemnumber from X1
UNION ALL
select X2.itemnumber from X2)

只在一个领域尝试过,看看它是否有效,但它没有:/

我想一旦我添加了 X 表中的所有数据,然后我运行几个 UPDATE 并为每个 Xx 表运行 WHERE EXISTS,将相应的 Xx 属性设置为 true,然后我就完成了。

但我什至很难做一些“简单”的事情,比如将几个表中的数据合并到一个......

【问题讨论】:

    标签: sql ms-access


    【解决方案1】:

    首先,您使用的是关系数据库,即使它设计得很糟糕。

    其次,您将无法使用 SQL 在同一语句中同时插入和更新。 SQL Server 2008 中为此引入了一个特殊子句,但它既不是标准 SQL 也不是 Access 变体的一部分。

    第三,您在 edit 1 中的INSERT 声明几乎正确,但并不完全正确。试试这个:

    INSERT INTO MAIN (
      field1,
      field2,
      x1,
      x2,
      ...)
    SELECT
      field1,
      field2,
      True,
      False,
      ...
    FROM X1
    UNION ALL
    SELECT
      field1,
      field2,
      False,
      True,
      ...
    FROM X2
    ...
    

    在代码中,field1field2 是所有表共有的“相同字段”的所有的替身,x1、@ 的列表987654326@, &c. 需要继续,直到您包含 MAIN 中的所有 xX 字段。然后在每个参与UNIONSELECT 中,有尽可能多的False 来匹配MAIN 中的字段计数,减去True 在位置上占据的那个(注意:如果是,则没有引号xX 字段的真正布尔数据类型(在 Access 中不能为 Null)。

    当然,这假设我已经正确理解了您描述不佳的架构....

    【讨论】:

    • 这个答案似乎忽略了避免重复创建的部分。
    • 对不起,如果描述是粗略的,我不知道如何更好地描述它;我也不是母语人士,所以也许我使用了一些奇怪的配方!不过,您似乎做对了:) 但是有一个问题:在我看来,这个查询会有问题:一个项目可以出现在不同的表中(它可以有多个属性为真);在您的示例中,如果一个项目在 X1 和 X2 中,“SELECT field1, field2, False, True, ... FROM X2”不会将 X1 属性设置为 false,即使它设置为 true ?跨度>
    • @David-W-Fenton--你说得对,我写的时候忘记了。
    • @Christian M--请记住,这只是插入,不更新现有行。一旦插入一行,它就不会改变。因此,新行将具有 x1=False,x2=True,但第一个插入的行仍将是 x1=True,x2=False。
    • 但我最终会得到很多重复,这不是目标。虽然是真的,但我没有说清楚。
    【解决方案2】:

    这是我在此期间使用的替代解决方案:

    INSERT INTO MAIN
    SELECT X1.itemnumber AS itemnumber
    FROM X1
    WHERE not exists (select itemnumber
    from MAIN
    where MAIN.itemnumber = X1.itemnumber);
    

    对每个 Xx 表重复。处理重复。

    然后,添加属性:

    UPDATE MAIN SET X1 = true
    WHERE exists (select *
    from X1
    where X1.itemnumber = MAIN.itemnumber);
    

    对每个 Xx 表重复。

    可能不是最有效的方法(实际上必须编辑查询 24 次...)
    但是,嘿,它起作用了......

    现在,如果有人有办法一次性做到这一点......

    【讨论】:

      【解决方案3】:
      if EXISTS(*SELECT STATEMENT*)
      Begin 
          //Update
      end
      ELSE
      BEGIN 
         //Insert
      END
      

      【讨论】:

      • 不知道我们可以在 sql 中使用 IF。将尝试从中得到一些东西!
      • “IF”在 Access 中不起作用...“无效的 SQL 指令”。或者也许我做得不对。
      • 不要为明确标记(并在问题文本中标识)为 Access 的问题发布非 Access SQL。 -1
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-11
      • 2011-09-06
      • 2014-09-15
      • 2012-06-16
      • 1970-01-01
      相关资源
      最近更新 更多