столбец неоднозначно определен в оракуле

Я не эксперт по sql. Я пытался выполнить следующий запрос в приглашении оракула sqlplus

select 0 AS initVal, 
loadTable.amount from 
accountsTable JOIN loadTable ON num=accNum ,
loadTable JOIN loanTable ON loadTable.numSeq=loanTable.numSeq

и получаю следующую ошибку

column ambiguously defined, which is pointing to loadTable.amount in select clause.

Я немного понимаю, что есть декартово произведение accountsTable JOIN loadTable ON num=accNum и loadTable JOIN loanTable ON loadTable.numSeq=loanTable.numSeq, после чего не могу понять, из какой таблицы выбрать loadTable.amount, так как результат обоих имеет этот столбец. Можно ли как-то избавиться от этой проблемы, не указывая другое соединение между этими двумя промежуточными таблицами на loadTable.amount?


person peeyush    schedule 08.06.2014    source источник


Ответы (1)


Это ваш запрос:

select 0 AS initVal, loadTable.amount
from accountsTable JOIN
     loadTable
     ON num=accNum ,
     loadTable JOIN
     loanTable
     ON loadTable.numSeq=loanTable.numSeq;

В вашем запросе есть loadtable дважды, чего я не думаю, что вы намереваетесь. И последнее условие — тавтология, потому что значение взято из той же таблицы. Кроме того, вы должны использовать псевдонимы таблиц, которые являются аббревиатурами — это упрощает написание и чтение запросов. Я думаю, что это ближе к тому, что вы пытаетесь сделать:

select 0 AS initVal, lt.amount
from accountsTable act JOIN
     loadTable lt
     ON act.num = lt.accNum JOIN
     loanTable lot
     ON lt.numSeq = lot.numSeq;

Общее правило: никогда не используйте запятую в операторах from. Всегда соединяйте таблицы соответствующими join.

РЕДАКТИРОВАТЬ:

Если вы считаете, что ваш запрос «логически» правильный, вы должны указать псевдонимы таблиц и указать конкретные соединения:

select 0 AS initVal, lot1.amount
from accountsTable act JOIN
     loadTable lot1
     ON act.num = lot1.accNum CROSS JOIN
     loadTable lot2 JOIN
     loanTable lnt
     ON lot1.numSeq = lot2.numSeq;

Эти условия соединения кажутся мне бессмысленными, особенно потому, что запрос извлекает amount только из одной таблицы, поэтому кажется, что вторая таблица даже не используется.

person Gordon Linoff    schedule 08.06.2014
comment
эй, подождите минутку .. вы преобразовали запрос из 3 соединений в 2 соединения. Я действительно намеревался 3 соединения (2 с условием и одно, которое делается с помощью запятой без условия соединения, также известного как декартово произведение) - person peeyush; 08.06.2014
comment
Вы должны отредактировать свой вопрос и показать образцы данных и желаемые результаты. - person Gordon Linoff; 08.06.2014
comment
так случайно вы имеете в виду, что оба будут давать одинаковый результат? Я чувствую это. - person peeyush; 08.06.2014
comment
Большое спасибо. Я могу понять, что в настоящее время моя логическая правильность может выглядеть бессмысленной. но это так. Спасибо за предложение псевдонимов, которые могут решить эту проблему. - person peeyush; 08.06.2014
comment
Было бы полезно, если бы вы просто описали как можно лучше, какую именно информацию вы хотите предоставить в запросе. Мы не можем судить о правильности, если не знаем, что вы пытаетесь сделать. - person TommCatt; 11.06.2014