Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.03.2012, 15:10   #1
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
Вопрос Перенос данных

СУБД MSSQL 2008.
Структура

Таблицы pa и x содержат данные. Мне необходимо составить запрос, который перенесет данные pa.az_name в az.az_name и x.name в az.name при этом не потерять целостность базы.
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.

Последний раз редактировалось mrChester; 30.03.2012 в 15:21.
mrChester вне форума Ответить с цитированием
Старый 30.03.2012, 17:24   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Если с селектом все Ok, тогда можно и с инсертом запустить
Код:
INSERT INTO AZ
  SELECT RM.ar_id,PA.az_name,X.name
    FROM X,PA,RM
    WHERE X.id=PA.x_id AND X.id=RM.x_id
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 02.04.2012, 09:10   #3
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

Но таблицы ar и rm тоже пустые...
Если бы не таблица az ссылалась на ar, а было бы наоборот, проблемы бы не возникло.
Здесь ситуация иная...
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.

Последний раз редактировалось mrChester; 02.04.2012 в 12:55.
mrChester вне форума Ответить с цитированием
Старый 02.04.2012, 14:40   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Тогда не ясно, к чему будет привязаны данные из AZ, если в AR их нет. Разве что создать в AR одну запись и все переносимые записи нацелить на неё, убрать из запроса RM, а вместо RM.ar_id просто id записи из AR константой
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 02.04.2012, 15:39   #5
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

pa и x старая структура. Пишу такой запрос, который обеспечит переход на новую структуру всех данных.
Проблему решил поначалу тем, что временно создавал столбец в ar, который хранил pa.id.
Осложнилось все тем, что az_name в pa не уникальный, а в az он становится уникальным.
Подскажите хотя бы как организовать такой запрос.
Мне нужно получить все записи, без повторений определенного столбца. DISTINCT отсеивает только повторяющиеся строки.
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Старый 02.04.2012, 16:35   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Для уникального az_name можно так
Код:
SELECT U.az_name,X.name
  FROM X,(SELECT PA.az_name,MAX(PA.x_id) AS x_id FROM PA GROUP BY PA.az_name) U
  WHERE U.x_id=X.id
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 02.04.2012, 18:06   #7
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

Решил я эту головоломку. Думаю есть способ намного проще, но для разового запуска и такой пойдет.
Код:
ALTER TABLE ar ADD pa_id nvarchar(200) NULL
GO
DECLARE @t TABLE (pa_id nvarchar(200))

INSERT INTO @t (pa_id)
SELECT pa.az_name
FROM X
	INNER JOIN pa ON (X.id = pa.x_id)
GROUP BY pa.az_name
HAVING COUNT(pa.az_name) >1

INSERT INTO ar (type, pa_id)
SELECT 0, pa.az_name
FROM X
	INNER JOIN pa ON (X.id = pa.x_id)
GROUP BY pa.az_name
HAVING COUNT(pa.az_name) <2

INSERT INTO ar (type, pa_id)
SELECT 0, pa_id
FROM @t

INSERT INTO az (id, az_name)
SELECT DISTINCT ar.id, ar.pa_id
FROM X
	INNER JOIN pa ON (X.id = pa.x_id)
	INNER JOIN ar ON (ar.pa_id = pa.az_name)

INSERT INTO rm (x_id, ar_id)
SELECT x.id, az.id
FROM X
	INNER JOIN pa ON (X.id = pa.x_id)
	INNER JOIN az ON (az.az_name = pa.az_name)

ALTER TABLE ar DROP COLUMN pa_id
GO
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
MySQL перенос данных между базами данных с MyDAC Nikolay88 БД в Delphi 3 14.05.2011 00:17
Изменение данных и перенос данных из одной таб в другую Kot9ra Microsoft Office Access 13 02.07.2010 12:22
перенос данных seriousMalish SQL, базы данных 2 27.05.2010 09:27
Перенос данных Diamand Microsoft Office Access 1 26.03.2010 16:44
сортировка данных (пересчет возможных вариантов комбинаций, перенос данных в таблицу) Vitalik85 Microsoft Office Excel 4 12.08.2009 00:30