SQL выберите либо таблицу 1, либо таблицу 2 - PullRequest
2 голосов
/ 15 апреля 2020

У меня есть два следующих запроса. Как я могу изменить это в один запрос? Результат должен быть истинным, если любой запрос возвращает данные, и ложным в противном случае:

select custId from customer where customerId=3425632456 and custPhone='5653663251';

select accountnumber from account where accountId=524526 and accountPhone='5653663251';

Здесь custPhone = accountPhone

Ответы [ 3 ]

4 голосов
/ 15 апреля 2020

Я думаю, что вы хотите exists:

select case 
    when exists (select custId from customer where customerId=3425632456 and custPhone='5653663251') 
        then 1
    when exists (select accountnumber from account where accountId=524526 and accountPhone='5653663251') 
        then 1
    else 0
end res
from dual

Этот запрос всегда возвращает одну строку с одним столбцом с именем res. Если какой-либо из подзапросов что-то возвращает, то res имеет значение 1, иначе 0.

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


Если вы действительно хотите вернуть значения, это не так. Один из вариантов - union all:

select custId from customer where customerId=3425632456 and custPhone='5653663251'
union all
select accountnumber from account where accountId=524526 and accountPhone='5653663251'

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

1 голос
/ 15 апреля 2020

Вы можете сделать FULL OUTER JOIN для двух таблиц и проверить счет, используя оператор CASE:

SELECT
    CASE
        WHEN COUNT(*) > 0
        THEN 'TRUE'
        ELSE 'FALSE'
    END result,
FROM
    customer c 
    FULL OUTER JOIN
    account a
    ON c.custPhone = a.accountPhone
WHERE c.customerId=3425632456
AND a.accountId=524526
AND c.custPhone='5653663251;
1 голос
/ 15 апреля 2020

Попробуйте это

select 
    custId,
    accountnumber 
from customer c
left join account a
on c.custPhone = a.accountPhone
where customerId = 3425632456 
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...