2012-05-02 3 views
0

необходимости данных портов в SQL таблицеНеобходимость данных портов в SQL дочерней таблицы

У меня есть мастер-таблица со столбцами (masterid, masterdata, year). Здесь masterid является столбцом идентификации.

У меня есть данные за 2012 год, мне нужно же 2012 данные на 2013

я мог бы решить эту проблему, просто запустить SQL заявление, как:

INSERT INTO mastertable 
    SELECT masterdata, 2013 
    FROM mastertable WHERE Year = 2012 

Я хотел бы запустить аналогичный вид бега для детского стола также.

Моя структура ребенок таблица: (childid , masterid, childdata)

Здесь у ребенка данные за 2012 год, я хочу иметь аналогичные данные за 2013 год с правильными masterid созданными для основных данных на 2013 год в первом этапе ,

Предпочтительно Я хотел бы иметь решение без добавления дополнительных временных столбцов

Любого свинца высоко оценил.

С уважением, Kumar.

+0

«Здесь у меня есть ребенок данные за 2012 год, я хочу иметь аналогичные данные за 2013 год с надлежащей masterid созданной для основных данных на 2013 год в первом шаге.» Его не очень ясно – Maddy

+0

за 2013 год. У меня есть строки, созданные в мастер-таблице. Мне нужно дублировать данные в дочерней таблице с правильными идентификаторами-хозяевами, созданными в главной таблице, поскольку дочерняя таблица имеет ссылку на главную таблицу. – Brainchild

+0

Проверьте предложение OUTPUT. –

ответ

0

Вам нужно будет сохранить ссылки между записями 2013 и 2012 годов, созданными в таблице mastertable. Если вы хотите достичь этого без добавления дополнительных временных столбцов, вам нужно будет использовать T-SQL.

(Я догадался, что тип varchar(max) для masterdata, так как вы не указали его тип).

DECLARE @links TABLE (masterid int, newmasterid int) 
DECLARE @mastertemp TABLE (masterid int, masterdata varchar(max)) 

DECLARE @masterid int, 
     @masterdata varchar(max) 

INSERT INTO @mastertemp 
SELECT  masterid, 
      masterdata 
FROM  mastertable 
WHERE  [year] = 2012 

WHILE EXISTS (SELECT TOP 1 * FROM @mastertemp) 
BEGIN 
    SELECT TOP 1 @masterid = masterid, 
        @masterdata = masterdata 
    FROM   @mastertemp 

    INSERT INTO mastertable 
    VALUES (@masterdata, 2013) 

    INSERT INTO @links 
    VALUES (@masterid, SCOPE_IDENTITY()) 

    DELETE FROM @mastertemp 
    WHERE  masterid = @masterid 
END 

INSERT INTO childtable 
SELECT  l.newmasterid, 
      c.childdata 
FROM  childtable c 
INNER JOIN @links l ON c.masterid = l.masterid 
+0

Ваше решение абсолютно верно. проверка любой опции, чтобы избежать временных таблиц и циклов. – Brainchild

+0

@kumar: насколько я знаю, это невозможно без временных таблиц или создания временных столбцов. – weenoid

0

Предположим ChildId является столбцом идентификаторов с автоматическим приращением

Вы можете обернуть их в функции/хранимую процедуру без необходимости временной таблицы.

ОБНОВЛЕНО

Declare @Year  int 

SET @Year = 2011 

INSERT INTO MasterTable 
SELECT masterdata, 2013 
FROM mastertable WHERE Year = @Year 

INSERT INTO childtable 
SELECT SCOPE_IDENTITY(), c.childdata 
FROM childtable c 
WHERE masterid in 
(
    SELECT masterid 
    FROM masterTable 
    WHERE Year = @Year 
) 
+0

Это не установит правильные значения 'childtable.masterid', они все равно будут указывать на записи за 2012 год. То, что делает ваш запрос, по существу дублирует уже имеющиеся данные «childtable». – weenoid

+0

Согласитесь с Weenoid. – Brainchild

+0

См. Мой ответ – Turbot

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