2016-08-23 4 views
0

У меня есть две таблицы: table1 и TABLE2Копировать столбец из другой таблицы с 'где'

Table1

id   name  value  source 
----------- ----------- ----- ------------ 
1   a   4   10 
2   b   5   10 
3   c   6   11 

Table2

 set   text  
    ----------- ----------- 
     7   h       
     8   g    

Я хочу, чтобы скопировать столбец 'значение' для Таблица 2 из Таблицы 1, where table1.source = 10

 set   text  value 
    ----------- ----------- --------- 
     7   h    4   
     8   g    5 

Я попытался это:

ALTER TABLE Table2 ADD value INT NOT NULL DEFAULT 0 

      UPDATE tb2 
      SET tb1.value = tb2.value 
      from Table2 tb2 
      JOIN Table1 tb1 
      ON tb1.source=10 

он дал мне это:

id   name  value  
    ----------- ----------- --------- 
    7   h   4   
    8   g   4   

Это обновление строк TABLE2 только первый source значение из Table1.

Что я делаю неправильно? Спасибо заранее!

+0

@GordonLinoff У меня есть Microsoft SQL, поэтому он не вызывает никаких ошибок. – Wafae

+0

. , Отметил. При задании вопросов, пожалуйста, отметьте соответствующим образом. –

+0

У вас недостаточно информации в двух таблицах для их объединения, так что 'set' 7 относится к 'value' 4 и 8 => 5. Вот почему вы в конечном итоге оба установлены на 4. Вам нужно кричать SQL-движок, как «подключить» строки, так как в таблице нет подразумеваемого порядка. – Tony

ответ

0

Если вы используете сервер sQL, используйте приведенный ниже запрос для обновления таблицы2. Обратите внимание, что сценарий специфичен для данных образца.

ALTER TABLE Table2 
ADD value INT NOT NULL DEFAULT 0 
GO 

WITH cte_data 
as 
(SELECT ROW_NUMBER() OVER(ORDER BY [set])RNo,* 
FROM Table2) 

UPDATE c 
SET c.Value=t.Value 
FROM cte_data c 
JOIN Table1 t on c.RNo=t.Id 
WHERE t.Source=10 
+0

Это помогло мне найти правильный ответ. Благодаря! – Wafae

0

Может быть, вы можете попробовать это:

insert into table2 (value) select (value) from table1 where table1.source = 10 

Просто добавьте новое поле «значение» в «table2» и попробовать этот подход.

+0

Это создает две новые строки в таблице 2 с столбцами NULL. – Wafae

0

Для соединения требуется номер строки. Я бы посоветовал поместить это в обе таблицы:

WITH toupdate AS (
     SELECT tb1.*, 
       ROW_NUMBER() OVER (PARTITION BY source ORDER BY id) as seqnum 
     FROM table1 tb1 
    ) 
UPDATE toupdate 
    SET tb1.value = tb2.value 
    FROM toupdate tb1 JOIN 
      (SELECT tb2.*, 
        ROW_NUMBER() OVER (ORDER BY set) as seqnum 
      FROM table2 tb2 
     ) tb2 
      ON tb2.seqnum = tb1.seqnum 
    WHERE tb1.source = 10; 
Смежные вопросы