Как сравнить две таблицы и заменить пустые значения значениями из другой таблицы в SQL Server / Azure SQL - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть две таблицы с одинаковой структурой, но немного разными значениями.Если запись таблицы 1 имеет некоторые значения столбца как ноль, то ее необходимо обновить до значения в таблице 2, и наоборот.

Таблица 1

+--------------------+
|  id | exp | last   |
+--------------------+
| 1  | null | 4005   |
| 2  | null | null   |
| 3  | 10/19  | 1001 |
+--------------------+

Таблица 2

+-------------------+
|  id | exp | last  |
+-------------------+
| 1  | 08/23 | null |
| 2  | 07/21 | 3867 |
| 3  | null  | 1001 |
+-------------------+

Обязательный вывод

Таблица 3

+--------------------+
|  id | code | last  |
+--------------------+
| 1  | 08/23 | 4005  |
| 2  | 07/21 | 3867  |
| 3  | 10/19  | 1001 |
+--------------------+

Является ли это внешним объединением, и если да, то как мне это сделать на SQL Server / Azure SQL?

Ответы [ 3 ]

1 голос
/ 22 апреля 2019
select t1.id,
case when t1.exp is null then concat(t1.exp, t2.exp)  when t2.exp is null then concat(t1.exp, t2.exp) 
when t1.exp is not null then (t1.exp) when t2.exp is not null then (t2.exp)  end as exp,
case when t1.last is null then concat(t1.last, t2.last) 
when t2.last is null then concat(t1.last, t2.last) when t1.last is not null then (t1.last) 
when t2.last is not null then (t2.last) end as last
from Table1 t1 join Table2 t2 on t1.id=t2.id

enter image description here

0 голосов
/ 22 апреля 2019

С coalesce():

select 
  t1.id,
  coalesce(t1.exp, t2.exp) exp,
  coalesce(t1.last, t2.last) last,
from table1 t1 inner join table2 t2
on t2.id = t1.id

это дает приоритет table1 значениям, если они не null.Также, если есть случай, когда количество строк в 2 таблицах не одинаково, то вы должны использовать left join из таблицы с наибольшим количеством строк в другой.Если вы хотите вставить эти строки в table3:

insert into table3 (id, exp, last)
select 
  t1.id,
  coalesce(t1.exp, t2.exp) exp,
  coalesce(t1.last, t2.last) last,
from table1 t1 inner join table2 t2
on t2.id = t1.id
0 голосов
/ 22 апреля 2019

Простой оператор обновления с CASE или IIF будет делать:

UPDATE t1 
    IIF(t1.exp IS NULL, t2.exp, t1.exp)
    IIF(t1.last IS NULL, t2.exp, t1.exp)
FROM
    Table1 t1 
LEFT JOIN Table2 t2 
    ON t1.id = t2.id 

UPDATE t2
    IIF(t2.exp IS NULL, t1.exp, t2.exp)
    IIF(t2.last IS NULL, t1.exp, t2.exp)
FROM
    Table2 t2 
LEFT JOIN Table1 t1
    ON t1.id = t2.id 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...