Обновление / создание строк в таблице SQL Server на основе данных из другой таблицы - PullRequest
1 голос
/ 25 октября 2011

У меня есть две таблицы SQL Server.В одной таблице четыре столбца nvarchar(50), которые могут быть пустыми, и столбец ID.Вторая таблица имеет два столбца: ID, nvarchar(50) столбец, допускающий значение NULL

Я пытаюсь вставить строки во второй таблице в первую таблицу.Как я могу обнаружить пустой столбец в первой таблице и вставить данные из второго столбца в пустую ячейку?

Пример:

Добавить из второй таблицы

1   value3

к первой таблице

1     value1   value2   null    null

, поэтому результирующая строка будет

1     value1   value2   value3   null

Ex2:

Добавить из второй таблицы

2   value1

к первой таблице

nothing for ID 2

, поэтому результирующая строка будет

2     value1   null   null   null

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

Ответы [ 2 ]

2 голосов
/ 25 октября 2011
declare @T1 table
(
  ID int primary key,
  C1 varchar(50),
  C2 varchar(50),
  C3 varchar(50),
  C4 varchar(50)
);

declare @T2 table
(
  ID int primary key,
  C varchar(50)  
);

insert into @T1 values (1, 'value1', 'value2', null, null) ;

insert into @T2 values (1, 'value3');
insert into @T2 values (2, 'value1');

merge @T1 as T1
using @T2 as T2
on T1.ID = T2.ID
when not matched then
  insert (ID, C1)  values (T2.ID, T2.C)
when matched then
  update set
    C1 = case when T1.C1 is null 
           then T2.C 
           else T1.C1 
         end,
    C2 = case when T1.C1 is not null and 
                   T1.C2 is null 
           then T2.C 
           else T1.C2 
         end,
    C3 = case when T1.C1 is not null and 
                   T1.C2 is not null and 
                   T1.C3 is null 
           then T2.C 
           else T1.C3 
         end,
    C4 = case when T1.C1 is not null and 
                   T1.C2 is not null and 
                   T1.C3 is not null and 
                   T1.C4 is null 
           then T2.C 
           else T1.C4 
         end
;

select *
from @T1;

Результат:

ID C1     C2     C3     C4
-- ------ ------ ------ ------
1  value1 value2 value3 NULL
2  value1 NULL   NULL   NULL
0 голосов
/ 26 октября 2011

Вот еще одна попытка.Я полностью изменяю вашу архитектуру здесь, но вы все равно можете найти ее полезной.

Несортированный набор значений

Для этого ответа я предполагаю, что порядок столбцов НЕ важен (вы в основномхранение набора значений в них).Я думаю, что лучшая архитектура для этого - хранить каждое значение в отдельной строке.Это значительно упрощает запросы и изменения (отсюда мой комментарий к вашему вопросу).

В этом случае я бы создал новую таблицу, которая выглядит следующим образом:

ID    ValueSet
1     value1
1     value2
1     value3
2     value1

Дляпреобразовав две таблицы в эту, вы можете использовать следующий запрос:

SELECT ID,C1 AS `ValueSet` FROM `tab1` WHERE C1 IS NOT NULL
   UNION SELECT ID,C2 FROM `tab1` WHERE C2 IS NOT NULL
   UNION SELECT ID,C3 FROM `tab1` WHERE C3 IS NOT NULL
   UNION SELECT ID,C4 FROM `tab1` WHERE C4 IS NOT NULL
   UNION SELECT ID,C1 FROM `tab2` WHERE C1 IS NOT NULL

Таким образом удаляются значения NULL, а значения tab2 добавляются по мере необходимости.

Снова обратите внимание, что выпотерять порядок столбцов здесь.

Набор отсортированных значений

Если порядок важен, вы все равно можете включить при создании с помощью этого измененного запроса:

SELECT ID,C1 AS `ValueSet`,'1' AS 'Order'  FROM `tab1` WHERE C1 IS NOT NULL
UNION SELECT ID,C2,'2' FROM `tab1` WHERE C2 IS NOT NULL
UNION SELECT ID,C3,'3' FROM `tab1` WHERE C3 IS NOT NULL
UNION SELECT ID,C4,'4' FROM `tab1` WHERE C4 IS NOT NULL
UNION SELECT ID,C1,'5' FROM `tab2` WHERE C1 IS NOT NULL

Затем, если вам нужен отсортированный набор значений для идентификатора1, вы можете использовать:

SELECT ValueSet FROM `myNewTable` WHERE ID = '1' ORDER BY Order ASC;

, что даст:

value1
value2
value3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...