|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Запрос на копирование данных
Помогите, пожалуйста, написать запрос!
Есть две таблицы, Table1, Table2. В одной из них есть столбцы a1, b1, c1, но c1 не заполнен. В другой a2,b2,c2, заполнены все три. Как перенести значения из с2 в с1? При таком запросе: UPDATE Table1 SET с1 = (SELECT с2 FROM Table2 where Table1.a1=Table2.a2 and Table1.b1=Table2.b2) выдаёт ошибку "Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression." Как правильно написать запрос, чтобы каждому конкретному значению возвращалось только одно? |
#2
|
||||
|
||||
А можно ли вообще средствами SQL делать такие операции????
Таблицы могут быть разными по размеру. Поэтому тут вряд ли можно написать универсальный запрос. Я думаю без цикла здесь не обойтись |
#3
|
|||
|
|||
В каком смысле, разные?
какая разница, какого они размера? Ну, если конкретный пример, в первой таблице - 1000 записей, одни из столбцов - дата и код метеостанции. Ещё есть поле температуры, которое по 5-ти метеостанциям заполнено, а по 6-ой - нет. Это, например, 100записей. А в другой таблице 200 записей, по 5 и 6 метеостанции, из которых как раз можно пополнить пропуски в первой таблице: там идёт дата, код метеостанции, температура. Осталось соответственно перенести по каждой дате 6-ой метеостанции данные во первую таблицу, т.е. берётся первая запись из второй таблицы, например 1.01.2010, код 6, ищется в первой таблице запись с таким же сочетанием даты и кода, и помещается туда температура. И т.д. Вроде кажется просто, но обычным Update этого не сделать, т.к., как я понимаю, в написанном мной запросе он отбирает сразу все записи, для которых пара полей в одной таблице равны паре в другой, а не по очереди по одной записи... Но может я ошибаюсь... |
#4
|
|||
|
|||
Код:
UPDATE Table1, Table2 SET Table1.с1 = Table2.с2 WHERE Table1.a1=Table2.a2 and Table1.b1=Table2.b2 |
#5
|
|||
|
|||
Цитата:
Ошибка в первой строке "UPDATE Table1, Table2" на перечислении двух таблиц.. |
#6
|
|||
|
|||
Проблема в том, что для Update, твой подзапрос должен вернуть всего одну строчку, а у тебя, похоже, коды повторяются (a1 и b1).
Теперь о задаче. Вариант 1. Если это разрвая операция, то лучше просто удалить данные о 6 станции из первой таблицы и скопировать туда данные из второй. Код:
begin delete from table1 where a1 = 6; insert into table1 (a1, b1, c1) values (select a1, b1, c1 from table2 where a1 = 6); commit; Вариант 2. Если это постоянная проблема, то: а) решаем ее как и в в.1, но только делаем процку, которую периодически и запускаем. б) делаем view так, что в нее попадают данные для всх станций кроме 6 из первой таблицы и данные из второй таблицы, но только о 6ой станции: Код:
create view table_view as select a1, b1, c1 from table1 where a1 <> 6 union all select a1, b1, c1 from table2 where a1 = 6; |
#7
|
|||
|
|||
Цитата:
Вообще, комбинации a1 и b1 не повторяются. Но даже если повторяются, что плохого? Значит, во все строки первой таблицы, где встречается сочетание a1-b1 вставлять одно и тоже значение с1. (Во второй таблице точно повторяющихся сочетаний нет). Вариант с удалением не подходит, т.к. в первой таблице помимо этих трёх полей содержится ещё огромное количество других... Просто так оказалось, что кусок одного из этих полей не заполнен, и его можно заполнить, взяв данные из другой таблицы. Делать новую таблицу и в неё перемещать данные из обеих таблиц проблематично, т.к. получается, что нужно для части записей перенести данные полностью из первой таблицы, а для части (например, с 201ой по 301ую) - все, кроме этого поля, из первой, а это поле из второй. Кроме того, проблемно будет восстанавливать ключи и связи к этой таблице. Да и из старой удалить записи невозможно, т.к. на них ссылаются другие таблицы. Неужели никак нельзя просто вставить записи в этот столбец по определённому условию?... Ну может циклом.. |
#8
|
||||
|
||||
Здесь пахнет вложенным подзапросом.
Если используется локальный SQL (таблицы типа paradox), то я бы сделал циклом, от безысходности. А подзапросы можно делать вроде на IB и на ADO ... |
#9
|
||||
|
||||
Что не устраивает?
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |