Получение большего количества записей при объединении двух таблиц в SQL Server

У меня есть две таблицы, EMP и EMP_DETAILS, которые я использую в решении ETL.

В первой последовательности следующий запрос записывается в промежуточную (временную) таблицу после добавления некоторых значений по умолчанию.

SELECT 
    EMP_DETAILS.EMP_NO, 
    EMP_DETAILS.EMPID_NO, 
    EMP_DETAILS.ADDR1,  
    EMP_DETAILS.ADDR2, 
    EMP_DETAILS.START_DTTM, 
    EMP_DETAILS.END_DTTM, 
    EMP_DETAILS.CREATE_DTTM, 
    EMP_DETAILS.ARCHV_FLAG AS EMP_DET_ARCHV_FLAG, 
    EMP.ARCHV_FLAG AS EMP_ARCHV_FLAG
FROM
    EMP_DETAILS, EMP 
WHERE
    EMP_DETAILS.EMP_NO = EMP.EMP_NO
    AND ISNULL(EMP.ARCHV_FLAG,'N') = 'N'
    AND ISNULL(EMP_DETAILS.ARCHV_FLAG,'N') = 'N'

(ARCHV_FLAG - это флаг, указывающий, заархивирована запись или деактивирована)

Вторая последовательность использует приведенный ниже запрос для извлечения еще нескольких (заархивированных) записей, которых уже нет в таблице stg.

SELECT 
    EMP_DETAILS.EMP_NO, 
    EMP_DETAILS.EMPID_NO, 
    EMP_DETAILS.ADDR1, 
    EMP_DETAILS.ADDR2, 
    EMP_DETAILS.START_DTTM, 
    EMP_DETAILS.END_DTTM, 
    EMP_DETAILS.CREATE_DTTM,  
    EMP_DETAILS.ARCHV_FLAG AS EMP_DET_ARCHV_FLAG, 
    EMP.ARCHV_FLAG AS EMP_ARCHV_FLAG
FROM
    EMP_DETAILS, EMP 
WHERE
    EMP_DETAILS.EMP_NO = EMP.EMP_NO
    AND NOT EXISTS (SELECT 'x'
                    FROM STG_EMP_TEMP STG 
                    WHERE STG.EMP_NO = EMP_DETAILS.EMP_NO)

(Вышеупомянутые запросы были написаны разработчиком, который больше не работает, поэтому я понятия не имею, что достигается ..)

Теперь я пытаюсь объединить последовательности, поэтому я объединяю оба запроса, используя соединение, как показано ниже:

SELECT * FROM (
SELECT 
EMP_DETAILS.EMP_NO, 
EMP_DETAILS.EMPID_NO, 
EMP_DETAILS.ADDR1, 
EMP_DETAILS.ADDR2, 
EMP_DETAILS.START_DTTM, 
EMP_DETAILS.END_DTTM, 
EMP_DETAILS.CREATE_DTTM, 
EMP_DETAILS.ARCHV_FLAG AS EMP_DET_ARCHV_FLAG, 
EMP.ARCHV_FLAG AS EMP_ARCHV_FLAG
FROM EMP_DETAILS ,EMP 
WHERE EMP_DETAILS.EMP_NO = EMP.EMP_NO
)A
left join (
SELECT EMP.EMP_NO FROM
FROM EMP_DETAILS ,EMP 
WHERE EMP_DETAILS.EMP_NO = EMP.EMP_NO
AND ISNULL(EMP.ARCHV_FLAG,'N') = 'N'
AND ISNULL(EMP_DETAILS.ARCHV_FLAG,'N') = 'N'
) B
on isnull(A.EMP_NO,'') = isnull(B.EMP_NO,'')
and B.EMP_NO is null

Однако, используя комбинированный SQL, я получаю некоторые дополнительные архивные записи, которые не были извлечены с помощью предыдущего решения.

Правильный ли мой способ присоединиться?

TIA!

Забыл упомянуть, что количество элементов между EMP и EMP_DETAILS равно 1: 1..N .. Сотрудник может иметь как минимум от 1 до многих подробных записей

NetTechie 10.08.2018 14:06
Отказ от вредных привычек: использование JOIN в старом стиле - этот старый стиль список таблиц, разделенных запятыми был заменен синтаксисом правильный ANSI JOIN в стандарте ANSI-92 SQL (более 25 лет назад), и его использование не рекомендуется
marc_s 10.08.2018 14:19
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
30
1

Ответы 1

Если все, что вам нужно, это объединить результаты обоих запросов, вы можете использовать UNION.

SELECT 
EMP_DETAILS.EMP_NO, 
EMP_DETAILS.EMPID_NO, 
EMP_DETAILS.ADDR1, 
EMP_DETAILS.ADDR2, 
EMP_DETAILS.START_DTTM, 
EMP_DETAILS.END_DTTM, 
EMP_DETAILS.CREATE_DTTM, 
EMP_DETAILS.ARCHV_FLAG AS EMP_DET_ARCHV_FLAG, 
EMP.ARCHV_FLAG AS EMP_ARCHV_FLAG
FROM
EMP_DETAILS, EMP 
WHERE
EMP_DETAILS.EMP_NO = EMP.EMP_NO
AND ISNULL(EMP.ARCHV_FLAG,'N') = 'N'
AND ISNULL(EMP_DETAILS.ARCHV_FLAG,'N') = 'N'

UNION

SELECT 
EMP_DETAILS.EMP_NO, 
EMP_DETAILS.EMPID_NO, 
EMP_DETAILS.ADDR1, 
EMP_DETAILS.ADDR2, 
EMP_DETAILS.START_DTTM, 
EMP_DETAILS.END_DTTM, 
EMP_DETAILS.CREATE_DTTM, 
EMP_DETAILS.ARCHV_FLAG AS EMP_DET_ARCHV_FLAG, 
EMP.ARCHV_FLAG AS EMP_ARCHV_FLAG
FROM
EMP_DETAILS ,
EMP 
WHERE
EMP_DETAILS.EMP_NO = EMP.EMP_NO
AND
 not exists (select 'x'
                    from    STG_EMP_TEMP STG 
                    where   STG.EMP_NO = EMP_DETAILS.EMP_NO
                    )

Нет, я не должен создавать какую-либо "промежуточную" таблицу .. пытаясь достичь без какой-либо временной таблицы ..

NetTechie 10.08.2018 13:59

Другие вопросы по теме