ACCESS / SQL:如何同时插入/更新?

时间:2011-01-12 10:32:32

标签: sql ms-access

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

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

我想做什么:

我想用MAx表中的数据提供MAIN表 事实上,可以有具有多个属性的项目,因此它们可以出现在例如X1,X2,X5中。

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

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

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

无论如何,我可以写什么查询来做到这一点:
如果MAIN中不存在表格X1的记录,则添加它并将X1字段设置为true 如果X1的记录已存在于MAIN中,请更新它并将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表中的所有数据,然后我为每个Xx表运行一些带有WHERE EXISTS的UPDATE,将相应的Xx属性设置为true,我就完成了。

但我很难做一些“简单”的事情,比如将几张桌子的数据合并成一张......

3 个答案:

答案 0 :(得分:1)

首先,你 使用关系数据库,即使它是一个设计糟糕的数据库。

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

第三,你编辑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是所有表格共有的“相同字段”的所有的替身,以及{的列表{1}},x1和& c。需要继续,直到您获得MAIN中的所有xX字段为止。然后,参与x2的每个SELECT都有尽可能多的UNION来匹配MAIN中的字段数,减去{{1}所占据的位数。 (注意:False字段中没有引号(如果它是真正的布尔数据类型 - 在Access中不能为空)。

当然,这假设我正确地理解了你描述得不好的架构......

答案 1 :(得分:1)

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

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次) 但是,嘿,它有效...

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

答案 2 :(得分:-4)

if EXISTS(*SELECT STATEMENT*)
Begin 
    //Update
end
ELSE
BEGIN 
   //Insert
END