В SQL мы всегда можем написать внутренний оператор соединения в качестве основного запроса и подзапроса, если мы хотим только найти пересечение? - PullRequest
1 голос
/ 25 апреля 2010

В SQL, мы всегда можем написать внутренний оператор соединения в качестве основного запроса и подзапроса или наоборот, если мы хотим только найти пересечение?

Например,

 select * from gifts g where g.giftID in (select giftID from sentGifts);

может выполнить объединение и показать подарки, отправленные в таблице sentGifts, но не сможет показать sentTime, поскольку он находится внутри подзапроса. Но если все, что нам нужно, это найти пересечение, не заботясь о том, что отображается, то мы всегда можем преобразовать одно в другое?

Ответы [ 2 ]

1 голос
/ 25 апреля 2010

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

Например:

select g.* from gifts g
join sentGifts s on s.Number=g.Number and s.Name=g.Name

Если единственным уникальным идентификатором в обеих таблицах является комбинация (Число, Имя), то невозможно преобразовать приведенное выше в оператор типа подзапроса.

0 голосов
/ 25 апреля 2010

В терминах набора оба запроса найдут пересечение двух наборов, так что не имеет значения, какую форму вы используете.

Вы всегда сможете конвертировать одну форму в другую.

В целях практического использования - большинство РСУБД будут работать лучше, если вы будете использовать подход на основе множеств с JOIN (они лучше оптимизированы для соединений). Как вы упомянули, существует также вопрос о возвращенном наборе результатов - вы должны использовать соединение, если вам нужны данные из обоих наборов.

...