这是我的情况。 首先,我不是在处理关系数据库,我只是使用访问作为操作数据的简单方法。 目前,我有很多桌子 一个主表,我们称之为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,我就完成了。
但我很难做一些“简单”的事情,比如将几张桌子的数据合并成一张......
答案 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
...
在代码中,field1
和field2
是所有表格共有的“相同字段”的所有的替身,以及{的列表{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