2011-01-12 65 views
3

这是我的情况。 首先,我没有在关系数据库上工作,我只是使用访问作为操纵数据的简单方法。目前,我有很多桌子。
一个主表,我们称之为主,另外约10个表,我们可以调用X1,X2,X3等。 X1表包含具有X1属性的项。 X2表包含具有X2属性的项目,依此类推。ACCESS/SQL:如何同时插入/更新?

所有的Xx表具有相同的字段。 MAIN表也具有相同的字段,此外还有布尔型的字段X1,X2等。

我想做什么:

我想从XX表中的数据养活主表。
事情是,可以有项目具有多个属性,所以它们可以出现在例如X1,X2,X5。

所以,我想在第一次运行这个:

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

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

无论如何,我可以写什么查询来执行此操作:
如果表X1的记录在MAIN中不存在,请添加它并将X1字段设置为true。
如果X1的记录已经存在于MAIN中,请更新它并将X1字段设置为true。

真(然后我将更新它在每一个X表我已经运行)。

我考虑INSERT INTO,但我不希望覆盖已经存在的数据或产生错误(我不知道这一切> _>)

在此先感谢谁可以提供提示。

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

所以我想这首先:

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

试图在只有一个领域,看看它的工作原理,但它并不:/

我想,一旦我已经从X的表中添加的所有数据,然后我跑FE w为每个Xx表更新一个WHERE EXISTS,将相应的Xx属性设置为true,然后完成。

,但我有一个困难时期,甚至做一些“简单”的合并从几个表中的数据到一个....

回答

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表。

propably不是最有效的方式(有编辑查询其实24倍...)
但嘿,它的工作...现在

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

-3
if EXISTS(*SELECT STATEMENT*) 
Begin 
    //Update 
end 
ELSE 
BEGIN 
    //Insert 
END 
+0

不知道我们可以在sql中使用IF。会试图从中得到一些东西! – 2011-01-12 12:11:59

+1

“IF”在Access中无效...“无效的SQL指令”。或者,也许我做得不对。 – 2011-01-12 12:46:26

1

首先,你有工作关系数据库,即使它设计得不好。

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

第三,你几乎权与INSERT语句进行编辑1,但并不完全。试试这个:

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名单,x2,&Ç需要继续,直到你已经包含MAIN中的所有xX字段。然后在参与UNION的每个SELECT都有多少个False,因为它需要匹配MAIN中的字段数,减去True(注意:如果它是真正的布尔数据类型,则不包含引号)不能在Access中为空)为xX字段。

这是假设,当然,我理解正确你不好描述的模式....