#sql #oracle
#sql #Oracle
Вопрос:
Было бы проблемой, если бы запрос select находился в левой части предложения where, а не в правой части, которую мы обычно используем.
select * from ABC A where (select ID from XYZ) in (A.ID, A.PID);
Нормально ли иметь запрос select в левой части запроса?
Комментарии:
1. Ваш вопрос неясен. Пожалуйста, уточните это. Кроме того, примеры данных и ожидаемый результат помогли бы.
2. На самом деле мне нужен запрос select * из ABC A, где A.ID в (выберите идентификатор из XYZ) или A.PID в (выберите идентификатор из XYZ), но я не хочу два подзапроса, поскольку это может замедлить процесс
3. Вот глупый вопрос (или три 🙂 Вы пытались запустить свой запрос? Если вы это сделали, вы получили сообщение об ошибке? Если вы получили ошибку, можете ли вы опубликовать ее?
4. @Abra Этот запрос работает. Но я просто хочу знать, хорошая ли это идея, вот и все
5. @SYMA этот запрос не работает, если ваш подзапрос возвращает более одной строки: dbfiddle.uk /…
Ответ №1:
Я думаю, exists
делает то, что вы хотите:
select a.*
from ABC a
where exists (select 1
from XYZ x
where x.id in (A.ID, A.PID)
);
Ответ №2:
Вы можете справиться с этим с помощью JOIN
select *
from ABC
left join XYZ on ABC.ID = XYZ.ID or ABC.PID = XYZ.ID
Комментарии:
1. Это возвращает что-то другое, вы не всегда можете заменить условие IN на JOIN
2. Таблица ABC содержит два столбца ABC. Идентификатор и ABC. PID и оба они проверяют значение в XYZ.ID . Таким образом, простое объединение обеих таблиц даст ожидаемый результат вместо того, чтобы писать подзапрос дважды.
3. Нет, если это приводит к нескольким совпадениям
Ответ №3:
Для этой проблемы есть вещь, которая называется INNER JOIN
.
select A.*
from ABC A
INNER JOIN XYZ X ON X.ID = A.ID OR X.ID = A.PID
Нет необходимости в каком-либо предложении where, поскольку это приведет к фильтрации результатов.
ИЛИ вы можете достичь этого, выполнив это:
SELECT *
FROM ABC
WHERE
ABC.ID IN (select ID from XYZ)
OR ABC.PID IN (select ID from XYZ)
Но первое решение должно быть предпочтительным.
Комментарии:
1. Да, я знаю о ВНУТРЕННЕМ СОЕДИНЕНИИ, но хочу знать, что не так с предложением WHERE
2. Вы пытаетесь выбрать значения с помощью вложенного запроса в левой части предложения where, где для предложения Where требуется поле для применения фильтров. ГДЕ <имя_поля> В (значения)
3. Да, и в вашем втором запросе вы можете видеть, что я дважды пишу один и тот же подзапрос. Мои подзапросы немного длиннее, поэтому их повторная запись может повлиять на производительность.
4. Именно по соображениям производительности вам необходимо использовать INNER JOIN.
5. итак, мой вопрос::выберите * из ABC A, где (выберите идентификатор из XYZ) в (A.ID , A.PID); Является ли этот подход неправильным?