Есть ли способ объединить эти две таблицы в SQL Server 2008?

#sql #sql-server

Вопрос:

Есть ли способ объединить эти таблицы в одну? Идея заключается в том, что запрос идентифицирует те, которые уже существуют во второй таблице, а затем обновляет эти строки в конечной таблице.

Я знаю очень простой SQL, левое соединение не решает проблему, объединение усложняет ее, и я очень запутался, используя «СУЩЕСТВУЕТ», также я не уверен, следует ли мне использовать в качестве условия соединения varchar.

Желаемый результат был бы примерно таким:

Весь Раздел ЭсКонСита ЭсАнтиципада ЭсАтрасада
0 Enero 0 0 0
42 Febrero 42 0 0
0 Marzo 0 0 0
0 Абриль 0 0 0
17 Mayo 12 3 2
12 Junio 12 0 0
 DECLARE @Base TABLE (
        Total INT
        ,Section VARCHAR(20)
        ,EsConCita TINYINT
        ,EsAnticipada TINYINT
        ,EsAtrasada TINYINT
        )

INSERT INTO @Base
values ( 0, 'Enero', 0, 0, 0),
( 0, 'Febrero', 0, 0, 0),
( 0, 'Marzo', 0, 0, 0),
( 0, 'Abril', 0, 0, 0),
( 0, 'Mayo', 0, 0, 0),
( 0, 'Junio', 0, 0, 0)

DECLARE @aux TABLE (
        Total INT
        ,Section VARCHAR(20)
        ,EsConCita TINYINT
        ,EsAnticipada TINYINT
        ,EsAtrasada TINYINT
        )

INSERT INTO @aux
values 
( 42, 'Febrero', 42, 0, 0),
( 17, 'Mayo', 12, 3, 2),
( 12, 'Junio', 12, 0, 0)
 

Комментарии:

1. Регистрация по названию месяца (раздела)? Копировать данные из aux в базу? Только существующие строки, не вставляя новые, которые существуют в aux, но не являются базовыми? И, наконец, вы действительно используете такую древнюю версию sql server?

Ответ №1:

Кажется, вы хотите left join , а затем берете ценность, @aux если она существует:

 select coalesce(nullif(a.total, 0), b.total, 0), b.section,
       coalesce(nullif(a.EsConCita, 0), b.EsConCita, 0) as EsConCita,
       coalesce(nullif(a.EsAnticipada, 0), b.EsAnticipada, 0) as EsAnticipada,
       coalesce(nullif(a.EsAtrasada, 0), b.EsAtrasada, 0) as EsAtrasada
from @base b full join
     @aux a
     on b.section = a.section
 

Ответ №2:

Запрос, который, я думаю, вам нужен, прост join

 update b set 
    b.Total=a.total,
    b.EsConCita=a.EsConCita,
    b.EsAnticipada=a.EsAnticipada,
    b.EsAtrasada=a.EsAtrasada
from @base b join @aux a on a.Section=b.Section