ДОСТУП / SQL: Как вставить INTO / UPDATE одновременно? - PullRequest
3 голосов
/ 12 января 2011

Вот моя ситуация.Во-первых, я не работаю над реляционной базой данных, я просто использую доступ как простой способ манипулирования данными.На данный момент у меня много таблиц.
Одна основная таблица, назовем ее 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 еще нет записей.

В любом случае, какой запрос я могу написать, который сделает это:
Если запись таблицы X1 еще не существует в MAIN, добавьте ее и установите для поля X1 значение true.
Если записьX1 уже существует в MAIN, обновите его и установите для поля X1 значение true.

(Тогда я бы обновил его для запуска на каждой таблице X, которая у меня есть.)

Я рассматриваю INSERTINTO, но я не хочу перезаписывать данные, которые уже существуют, или генерировать ошибку (я действительно не знаю много обо всем этом> _>)

Заранее благодарен всем, кто может дать советы.

edit 1
Я подумал, что сначала попробую вставить все данные из таблиц Xx в таблицу MAIN (они имеют одинаковую структуру)

, поэтому япопробовал это сначала:

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

попробовал это только на одном поле, чтобы увидеть, работает ли это, но это не так: /

Я понял, как только я добавил все данные изX таблиц, затем я запускаю несколько UPDATE с WHERE EXISTS для каждой таблицы Xx, устанавливая соответствующее свойство Xx равным tРю, и я сделал.

Но мне трудно даже сделать что-то столь же "простое", как объединение данных из нескольких таблиц в одну ....

Ответы [ 3 ]

1 голос
/ 12 января 2011

Во-первых, вы работаете с реляционной базой данных, даже если она плохо спроектирована.

Во-вторых, вы не сможете использовать 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: без кавычек, если этореальный логический тип данных - который не может быть нулевым в Access) для поля xX.

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

1 голос
/ 13 января 2011

Вот альтернативное решение, которое я использовал тем временем:

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 раза ...)
но эй, это сработало ...

Теперь, если у кого-то есть способ сделать это одним выстрелом ...

0 голосов
/ 12 января 2011
if EXISTS(*SELECT STATEMENT*)
Begin 
    //Update
end
ELSE
BEGIN 
   //Insert
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...