Оператор выбора в левой части условия where

#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); Является ли этот подход неправильным?