У меня есть таблица со столбцами ниже
TableX
TB1_ID
TB_GO_ID
TB_RET_ID
TB1_ID TB_GO_ID TB_RET_ID
1 22 NULL
2 23 24
3 25 null
и еще один стол TABLEY с
TB2
TB_ID
TB2_ID TB_ID
1 22
2 22
3 23
4 24
моя попытка
SELECT
TB1_ID,
isexist
FROM TABLEX r,TABLEY Y where Y.TB_ID in (R.TB_GO_ID, R.TB_RET_ID)
Ожидаемый результат
TB1_ID Isexist
1 yes
2 yes
3 FALSE
Здесь isexist зависит от того, существует ли этот идентификатор TB_GO_ID/TB_RET_ID в TABLEX. УСТАНОВИТЕ ЭТО ЗНАЧЕНИЕ В 1, иначе установите это значение в 0.
Я написал запрос, как показано ниже, чтобы получить идентификатор из таблицы и поле переменной, которое определяет, существуют ли TB_GO_ID, TB_ret_ID во второй таблице. я ожидаю одну строку с деталями таблицы x и новое поле, в котором говорится, существуют ли идентификаторы во второй таблице.
Я не знаю, что представляют собой 1, 2, 3 в ожидаемом результате; Я думал, что это должны были быть значения в TB_GO_ID и TB_RET_ID.
Предположим, что я прав, тогда:
Пример данных:
SQL> with
2 tablex (tb1_id, tb_go_id, tb_ret_id) as
3 (select 1, 22, null from dual union all
4 select 2, 23, 24 from dual union all
5 select 3, 25, null from dual
6 ),
7 tabley (tb2, tb_id) as
8 (select 1, 22 from dual union all
9 select 2, 22 from dual union all
10 select 3, 23 from dual union all
11 select 4, 24 from dual
12 ),
Запрос начинается здесь: temp
CTE создает список уникальных ненулевых значений идентификатора, хранящихся как в TB_GO_ID
, так и в TB_RET_ID
:
13 --
14 temp as
15 (select tb1_id, tb_go_id tb_goret_id from tablex where tb_go_id is not null
16 union
17 select tb1_id, tb_ret_id from tablex where tb_ret_id is not null
18 )
Наконец, проверьте, существуют ли temp
ID
в tabley
:
19 select distinct t.tb1_id,
20 case when y.tb_id is not null then 'yes' else 'no' end isexist
21 from temp t left join tabley y on y.tb_id = t.tb_goret_id
22 order by t.tb1_id;
TB1_ID ISEXIST
---------- ----------
1 yes
2 yes
3 no --> NO, because 25 does not exist in TABLEY
SQL>
Хорошо, нет большой разницы, просто выберите другой столбец. Исправил, смотри.
мы можем добиться этого в простом запросе?
Разве это не просто? Что в нем сложного?
на самом деле я переношу данные из старой базы данных в новую базу данных, где есть изменения структуры/схемы во всех таблицах, и существует около 25 таблиц. поэтому я пытаюсь уменьшить количество строк.
Я понимаю; не могу сказать, правда. Вы можете поместить все, что я написал (и что вы могли бы использовать) между строками 14-22, в одну очень длинную строку, таким образом, вы уменьшите код до одной строки, но я не уверен, что это принесет какие-либо улучшения.
Вы можете использовать EXISTS
с коррелированным подзапросом внутри выражения CASE
:
SELECT tb1_id,
CASE
WHEN EXISTS( SELECT 1
FROM TableY y
WHERE y.tb_id = x.tb_go_id
OR y.tb_id = x.tb_ret_id )
THEN 'yes'
ELSE 'false'
END AS is_exist
FROM TableX x
Что для примера данных:
CREATE TABLE TableX (TB1_ID, TB_GO_ID, TB_RET_ID) AS
SELECT 1, 22, NULL FROM DUAL UNION ALL
SELECT 2, 23, 24 FROM DUAL UNION ALL
SELECT 3, 25, NULL FROM DUAL;
CREATE TABLE TableY (TB2_ID, TB_ID) AS
SELECT 1, 22 FROM DUAL UNION ALL
SELECT 2, 23 FROM DUAL UNION ALL
SELECT 3, 23 FROM DUAL UNION ALL
SELECT 4, 24 FROM DUAL;
Выходы:
Образец данных :
select *,
case when TB_GO_ID in (select tb_id from TableY) then 'Yes'
when TB_RET_ID in (select tb_id from TableY) then 'Yes' else 'No' End as IF_Exists
from tablex
Вывод, как показано ниже:
1 22 NULL Yes
2 23 24 Yes
3 25 NULL No
4 NULL 26 No
1,2,3 - это TB1_ID, так как 25 не находится во второй таблице, значение ifexist здесь ложно