2011-01-12 3 views
3

Вот моя ситуация. Прежде всего, я не работаю над реляционной базой данных, я просто использую доступ как простой способ манипулирования данными. На данный момент у меня много столов.
Одна основная таблица, назовем ее MAIN и еще 10 другими таблицами, мы можем назвать X1, X2, X3 и т. Д. Таблица X1 содержит элементы, обладающие свойством X1. Таблица X2 содержит элементы, обладающие свойством X2, и так далее.ACCESS/SQL: как вставлять INTO/UPDATE одновременно?

Все таблицы Xx имеют одинаковые поля. MAIN table имеет те же поля, кроме того, поля 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 UPDATE с WHERE EXISTS для каждой таблицы Xx, установив для соответствующего свойства 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

не знал, что мы могли бы использовать IF в sql. попытается получить что-то от этого! –

+1

«IF» не работает в Access ... «Недопустимая инструкция SQL». Или, может быть, я не делаю это правильно. –

+1

Не отправляйте не-Access SQL для вопроса, четко обозначенного (и идентифицированного в тексте вопроса) как Access. -1 –

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 
... 

В коде field1 и field2 являются дублёров для все из «тех же полей», что все таблицы имеют в общем, и список x1, x2, & с ., необходимо продолжить, пока вы не включите все поля xX в MAIN. Затем в каждом SELECT, участвующем в UNION, должно быть столько False, сколько требуется для совпадения количества полей в MAIN, за вычетом того, что позиционно занято True (NB: нет кавычек, если это реальный тип данных Boolean, который не может быть Null in Access) для поля xX.

Это предполагает, конечно, что я правильно понял вашу плохо описанную схему ....

+0

Этот ответ, кажется, не учитывает того, чтобы избежать создания дубликатов. –

+0

Извините, если описание является отрывочным, я не знал, как это сделать лучше; также я не носитель языка, поэтому, возможно, я использовал некоторые странные формулировки! Тем не менее, кажется, что у вас все получилось. Один вопрос: мне кажется, что возникнет проблема с этим запросом: элемент может отображаться в разных таблицах (он может иметь несколько свойств true); в вашем примере, если элемент находится в X1 и X2, не будет ли «SELECT поле1, поле2, ЛОЖЬ, Правда, ... ОТ X2» поставить свойство X1 ложь, даже если это было установлено значение true? –

+0

@ David-W-Fenton - ты прав, я забыл об этом, когда писал. – RolandTumble

Смежные вопросы