У меня есть две таблицы, 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!
JOIN
в стандарте ANSI-92 SQL (более 25 лет назад), и его использование не рекомендуется
Если все, что вам нужно, это объединить результаты обоих запросов, вы можете использовать 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
)
Нет, я не должен создавать какую-либо "промежуточную" таблицу .. пытаясь достичь без какой-либо временной таблицы ..
Забыл упомянуть, что количество элементов между EMP и EMP_DETAILS равно 1: 1..N .. Сотрудник может иметь как минимум от 1 до многих подробных записей