Доступ к таблице из подзапроса во внутреннем соединении - MySql - PullRequest
0 голосов
/ 04 сентября 2018

У меня SQL-запрос следующим образом -

select 
* 
from A
inner join AA on A.id = AA.aid
inner join AAA on 
(
  select B.bid, B.bname 
  from B
  inner join C on B.id = C.bid
  where C.aaid = AA.id
) as B1 on A.id = B1.aid

Что выдает ошибку

Неизвестный столбец 'AA.id' в 'предложении where'

Будет очень полезно, если кто-нибудь скажет мне причину и предоставит мне возможное решение.

Ответы [ 3 ]

0 голосов
/ 04 сентября 2018

Из моего понимания

select 
* 
from #a1 a1 --A
inner join #a2 a2 on a1.i = A2.i --AA
inner join #a3 a3 on a1.i = a3.i --AAA
inner join
(
  select B.i, a2.i ai
  from #b b --B
  inner join #c c on B.i = C.i --C
  inner join #a2 a2 on a2.i = C.i  --AA
) as B1 
on A1.i = B1.i
and B1.ai = a2.i

Отсутствие выборки данных, мы помогаем в качестве предположения.

Верните меня, если запрос требует обновлений.

0 голосов
/ 04 сентября 2018

Это слишком долго для комментария, поэтому ...

Допустим, вы не записали подзапрос в предложении FROM как специальное представление, но сделали его явным представлением B1CREATE VIEW). Тогда ваш запрос будет читать

select * 
from A
inner join AA on A.id = AA.aid
inner join AAA on B1 on A.id = B1.aid

, который показывает, что ваш синтаксис выключен.

Кроме того, выбор B1 не содержит aid, только bid и bname.

Наконец, предложение ON для AAA не содержит ссылок на таблицу AAA, так что это не является критерием объединения для этой таблицы.

Это ответ на вопрос, что не так с вашим запросом. Я не могу показать вам правильный запрос, потому что совершенно неясно, чего вы пытаетесь достичь. Пожалуйста, дополните. Это, вероятно, довольно просто, и вы слишком усложняете вещи: -)

0 голосов
/ 04 сентября 2018

Я считаю, что вам нужно что-то вроде этого

select 
* 
from A
inner join AA on A.id = AA.aid
inner join AAA on AA.id = AAA.aid 
inner join
(
  select B.bid, B.bname, C.aaid
  from B
  inner join C on B.id = C.bid
) as B1 on A.id = B1.aid and AA.id = B1.aaid

Невозможно ссылаться на внешние псевдонимы в подзапросах соединения в MySQL. В PostgreSQL вы можете использовать CROSS JOIN LATERAL, а в SQL Server CROSS APPLY, однако в MySQL такой вещи нет.

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