Использование подзапросов в SQL - PullRequest
1 голос
/ 24 ноября 2010

В настоящее время у меня есть 2 таблицы:

Table Animal:
animal_id, animal_name owner

Table Owners
owner_id owner_name

Один из способов перечислить всех животных и их владельцев: использовать объединения SQL:

select animal_id, owner_name
from Animals, Owners
where (owner = owner_id);

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

select animal_id, owner_name
from Animals
where owner_name = (select owner_name from Owners where owner = owner_id)

но это не похоже на хитрость. Почему?

Ответы [ 4 ]

2 голосов
/ 24 ноября 2010

Если вы хотите, чтобы поле owner_name было включено в результаты, и это поле находится в таблице Owners, то вы должны каким-то образом ПРИСОЕДИНИТЬСЯ к Owners к запросу.Единственное, что вы можете вернуть как часть набора результатов, - это столбцы из включенных таблиц, констант или производных значений (используя функции языка Oracle для работы со столбцами и / или константными значениями).

Редактировать:

На самом деле, теперь, когда я думаю об этом, вы можете использовать (или, скорее, попробовать - я не пользователь Oracle) этот крайне плохо работающий синтаксис:

 SELECT animal_id, (SELECT owner_name FROM Owners WHERE owner = Animals.owner_id)
   FROM Animals

То естьтехнически решение подзапроса.

1 голос
/ 24 ноября 2010

Это не работает, потому что у вас есть столбец 'owner_name', которого нет в таблице в предложении from.Чтобы включить результат подзапроса в выборку, включите подзапрос в предложение select:

select animal_id, (select owner_name from Owners where owner = owner_id)
from Animals
0 голосов
/ 24 ноября 2010

Я думаю, у вас может быть недостаток дизайна: owner может показаться не атрибутом животного.

Скорее, право собственности может представлять собой отношения между животными и людьми (или кем бы то ни было владельцем). Таким образом, вы должны рассмотреть три таблицы, например Animals (таблица сущностей), People (или любая другая таблица сущностей) и Ownership (таблица отношений).

0 голосов
/ 24 ноября 2010

То, что вы используете, похоже на неявное декартовое соединение.

select animal_id, owner_name
from Animals, Owners
where (owner = owner_id);

Альтернатива - внутренние объединения

select animal_id, owner_name
from Animals A inner join Owners O
     on A.owner = O.owner_id;

Похоже, вам не нравится подзапрос в предложении SELECT,Я тожеЕсть подобные вещи, которые можно сделать без использования фактического слова «JOIN», но обычно это считается лучшим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...