2013-06-12 9 views
5

Я выполняю запрос, который содержит тот же самый вопрос-ответ, используемый несколько раз в статье WHERE.Тот же подзапрос, используемый несколько раз в одном запросе

У меня есть стол с буксирными полями client_id, buyer_id.

Суб-запрос возвращает список дат, которые должны быть исключены из результата.

Вот как я его использую.

SELECT 
    id, client_id, buyer_id 
FROM relation 
WHERE 
    client_id NOT IN (SELECT <some_id> FROM <some_table> WHERE ...) 
    AND buyer_id NOT IN (SELECT <some_ids> FROM <some_table> WHERE ...) 

Это работает как ожидалось, но что беспокоит меня, что есть два одинаковых подзапроса. Интересно, есть ли способ, которым я могу использовать его один раз и использовать результат для обоих мест.

Спасибо.

+0

Вы попробуйте заменить этот подзапрос с JOIN? – Taryn

+0

@bluefeet, я очень упростил этот запрос, чтобы дать вам настоящую проблему. Кроме того, я не могу понять, как выглядит выражение 'JOIN'' ON'. –

ответ

3

Вы можете написать это с помощью NOT EXISTS:

SELECT 
    id, client_id, buyer_id 
FROM relation AS r 
WHERE NOT EXISTS 
     (SELECT 1 
     FROM <some_table> 
     WHERE (r.client_id = <some_id> OR r.buyer_id = <some_id>) 
      AND ... 
    ) ; 
+0

Я получаю исключение «Ошибка корреляции поля» в аналогичном запросе. – serdar

1

Запросы вида:

select ... 
from <main query> 
where <select field> not in (select <subquery field> from <subquery>) 

обычно можно перефразировать:

select <main query fields> 
from <main query> 
left join <subquery> on <select field> = <subquery field> 
where <subquery field> is null 

Если подзапрос вы используете точно одинакова для обоих client_id и buyer_id, это поэтому следует переформулировать ваш запрос как:

SELECT id, client_id, buyer_id 
FROM relation 
LEFT JOIN <some_table> ON <some_id> IN (client_id, buyer_id) 
WHERE <some_id> IS NULL 

- таким образом эффективно используя подзапрос только один раз в запросе.

+0

Решение с соединением может не возвращать тот же результат, что и решение с подзапросом. –

+0

Точно, что я испытываю. Он не возвращает ту же строку, а больше строк. Также занимает дополнительное время. Мой первоначальный запрос работает через 41 секунду, а когда я использовал его в JOIN, то потребовалось 61 секунда. –

+1

@TalhaAhmedKhan Можете ли вы предоставить [SQL-Fiddle] (http://sqlfiddle.com/) некоторые данные? Я думаю, что этот запрос эквивалентен тому, что у вас есть (если столбцы 'client_id' и' buyer_id' не имеют значения NULL.) –

0

Ваш запрос может быть преобразован следующим образом:

SELECT 
    id, client_id, buyer_id 
FROM relation 
LEFT JOIN some_table 
) AS subquery ON (subquery.some_id IN (client_id, buyer_id) AND <condition that was in your subquery>) 
WHERE subquery.some_id IS NULL; 

Но у меня есть ощущение, что это будет по-прежнему выполнять очень плохо с точки зрения времени выполнения.

Рассмотрите возможность создания временной таблицы, содержащей содержимое вашего подзапроса.

0

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

Смежные вопросы