Когда я использую вложенный запрос для Postgres SQL? - PullRequest
0 голосов
/ 05 февраля 2011

какая разница между ..

select a.value1
from apple a, banana b, oranges o
where a.value1 = b.value1 and o.value1 = a.value1 and o.value2 = 'oranges';

compared to

select a.value1
from apple a
where a.value1 in (
   select b.value1
   from banana b, oranges o
   where b.value1 = o.value1 and o.value2 = 'oranges';
);

есть ли разница?

Ответы [ 2 ]

1 голос
/ 05 февраля 2011

Первый МОЖЕТ показывать значения из таблицы более одного раза, если условия объединения axbxc приводят к нескольким строкам.

Второй отображает значения из таблицы только один раз(поскольку он проверяет, находится ли он «в списке из подзапроса»)

Поскольку вы только начинаете с SQL, позвольте мне перефразировать ваш запрос с использованием синтаксиса ANSI SQL92, а также предложения EXISTS, котороеявляется альтернативой IN (но может оптимизироваться по-другому)

select a.value1
from apple a
where EXISTS (
   select *
   from oranges o
   INNER JOIN banana b on b.value1 = o.value1
   where o.value2 = 'oranges' and o.value1 = a.value1
);
0 голосов
/ 05 февраля 2011

Да, есть различия:

Если объединение b и o возвращает несколько строк с одинаковым значением b.value1, первый запрос также возвращает несколько строк. Второй запрос, однако, помещает все b.value1 в набор, поэтому дублированный b.value1 будет унифицирован.

...