Запрос, чтобы проверить, существует ли значение в другой таблице

У меня есть таблица со столбцами ниже

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 и новое поле, в котором говорится, существуют ли идентификаторы во второй таблице.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
63
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я не знаю, что представляют собой 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    )

Наконец, проверьте, существуют ли tempID в 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>

1,2,3 - это TB1_ID, так как 25 не находится во второй таблице, значение ifexist здесь ложно

coder11 b 20.04.2023 14:42

Хорошо, нет большой разницы, просто выберите другой столбец. Исправил, смотри.

Littlefoot 20.04.2023 14:45

мы можем добиться этого в простом запросе?

coder11 b 20.04.2023 14:48

Разве это не просто? Что в нем сложного?

Littlefoot 20.04.2023 14:49

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

coder11 b 20.04.2023 14:50

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

Littlefoot 20.04.2023 14:53
Ответ принят как подходящий

Вы можете использовать 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;

Выходы:

TB1_ID ЕСТЬ_СУЩЕСТВУЕТ 1 да 2 да 3 ЛОЖЬ

рабочий пример

Образец данных :

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

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