Скажем, у меня есть две таблицы: A и B.
Обе таблицы содержат одинаковую структуру: ID, имя, зарплата, домашнее хозяйство
Мне нужно обновить отсутствующие записи A с помощью B.
Таблица A:
ID NAME SALARY HOUSEHOLD
--------------------------------
1 John 100 2
2 Jane NULL 3
3 Mary 200 NULL
4 Ann NULL NULL
Таблица B:
ID NAME SALARY HOUSEHOLD
--------------------------------
1 John 400 2
2 Jane 200 3
3 Mary 200 1
4 Ann 125 1
После всех обновлений он должен выглядеть так
Таблица A:
ID NAME SALARY HOUSEHOLD
--------------------------------
1 John 100 2
2 Jane 200 3
3 Mary 200 1
4 Ann 125 1
Я пробовал этот SQL:
UPDATE A
SET SALARY = B.SALARY
FROM A
LEFT JOIN B ON A.ID = B.ID AND A.NAME = B.NAME
WHERE ISNULL(A.SALARY, '') = ''
AND ISNULL(B.SALARY, '') <> ''
Это мой начальный запрос на обновление. Я хочу иметь возможность обновить все столбцы и в основном изменить только имя столбца. Если бы я делал это вручную, я бы сделал следующее, как это.
UPDATE A
SET HOUSEHOLD = B.HOUSEHOLD
FROM A
LEFT JOIN B ON A.ID = B.ID AND A.NAME = B.NAME
WHERE ISNULL(A.HOUSEHOLD, '') = ''
AND ISNULL(B.HOUSEHOLD, '') <> ''
Я представляю, как использовать цикл, который будет переходить к следующей переменной в каком-то контейнере и использовать переменную вместо имени столбца. В моей реальной таблице у меня есть около 30 столбцов, которые нужно было обновить.
Это не должно быть петлей. Пока это делает работу. Буду рад узнать другие способы, если это облегчит работу!
Возможно, что-то вроде этого (это на 100% неправильно. Даже близко к правильному синтаксису):
for i <= 2
i = 1
@Column = ('ID', 'NAME')
UPDATE A
SET @Column = B.@Column
FROM A
LEFT JOIN B ON A.ID = B.ID AND A.NAME = B.NAME
WHERE ISNULL(A.@Column, '') = ''
AND ISNULL(B.@Column, '') <> ''
NEXT