#sql
#sql
Вопрос:
Недавно я начал изучать SQL, но, похоже, не могу разобраться в создании операторов SQL, которые формируют соответствующие результаты из нескольких таблиц / отношений.
Учитывая следующую схему:
Account(accNumber, balance, type)
Branch(BSB, phone, streetAddress, town)
registered(accNumber*, BSB*)
Я пытаюсь сформулировать некоторые выводы:
Перечислите все номера, зарегистрированные в определенном BSB (123), и покажите его указанный город (Сидней).
Я попробовал следующий оператор для первого запроса:
SELECT accNumber, BSB, town
FROM ACCOUNT, BRANCH
WHERE BSB = 123;
Тем не менее, я получаю список всех учетных записей, даже если они не принадлежат BSB, поэтому я попытался:
SELECT accNumber, BSB, town
FROM ACCOUNT, BRANCH
WHERE BSB = 123
AND Town = 'Sydney'
AND account.accNumber=registered.accNumber
AND branch.bsb=registered.bsb;
На этот раз я получаю неоднозначное определение столбца, потому что они имеют одинаковое имя в таблице «registered».
Я попытался создать псевдоним в статусе выбора, т.Е. AccNumber КАК ACCOUNT_NUMBER и т. Д., Но все равно получаю неоднозначно определенные ошибки.
Я попытался просто перечислить то, что было в зарегистрированной таблице, но тогда я не получаю название города, только AccNumber и BSB, переданные в качестве внешнего ключа.
Кажется, я не могу понять, как извлекать данные из других таблиц и правильно их отображать, и был бы очень признателен за любые советы!
Комментарии:
1. Вы должны использовать
join
оператор вместо запятых в своемfrom
предложении, и тогда это не будет проблемой. Ваш второй пример ссылаетсяregistered
на то, что не отображается в вашемfrom
предложении…
Ответ №1:
Это может помочь вам начать.
SELECT a.ccNumber, b.BSB, c.town
FROM ACCOUNT as a
inner join registered as b on b.accNumber=a.accNumber
inner join BRANCH as c on c.bsb = b.bsb
WHERE b.BSB = 123
AND c.Town = 'Sydney'
Комментарии:
1. Спасибо за помощь, Ахмед, теперь я вижу, что я выполнял условие до объединения, но по какой-то причине Orcacle выдает ошибку с вашим заявлением: Ошибка SQL: ORA-00933: команда SQL неправильно завершена 00933. 00000 — «Команда SQL неправильно завершена» * Причина: * Действие: яперед тем, как попробовать, разместил; после вашего утверждения, так что это не проблема с точкой с запятой: (
2. между a. и числом неправильно добавлен пробел, я его удалю. пожалуйста, попробуйте сейчас.
Ответ №2:
Итак, это звучит как общий вопрос SQL. Для вашего запроса вот на что вы смотрите:
select a.account_number
from account a, brance b, registered r
where a.account_number = r.account_number and
a.bsb = b.bsb and
b.bsb = 123;
Это даст вам все номера учетных записей из таблицы учетных записей, которые находятся в BSB 123. Когда у вас есть несколько таблиц с одним и тем же столбцом, вам нужно сообщить Oracle (и любой базе данных, если на то пошло), на какой столбец «account_number» вы ссылаетесь (поскольку в противном случае это неоднозначно, поскольку существует несколько таблиц, содержащих столбец account_number).
SQL — это таблицы и объединения. Иногда вам приходится объединять несколько таблиц, чтобы получить то, что вам нужно, как указано выше. Если вы не объединяете таблицы, как вы делали изначально, вы получите «перекрестный продукт», а это не то, что вы хотите.
Я знаю, что это очень «легкий», но, надеюсь, из приведенного выше ответа на ваш вопрос вы получите некоторое представление о том, как это сделать.
Я был бы рад помочь вам больше, если у вас есть вопросы. Каждый новичок в SQL в какой-то момент. Не расстраивайтесь по этому поводу. Это требует практики, а затем становится намного проще.
-Джим
Комментарии:
1. Спасибо allot за помощь и поддержку, Джим, я смог получить желаемый результат с некоторыми незначительными изменениями в этом коде (я просто включил AccNumber, BSB и город в первой строке, чтобы увидеть 3 столбца вместо одного) Из справки каждого я немного больше понимаю опорядок обработки при создании операторов и могу видеть, что у меня было мое условие до моего типа соединения. Еще раз спасибо.