Внешнее значение столбца в присоединенном подзапросе? - PullRequest
7 голосов
/ 22 апреля 2010

Можно ли использовать значение столбца из внешнего выбора в объединенном подзапросе?

SELECT table1.id, table2.cnt FROM table1 LEFT JOIN (SELECT COUNT(*) as `cnt` FROM table2 where table2.lt > table1.lt and table2.rt < table1.rt) as table2 ON 1;

В результате "Неизвестный столбец 'table1.lt' в 'where clause'".

Вот дамп базы данных.

CREATE TABLE IF NOT EXISTS `table1` ( `id` int(1) NOT NULL, `lt` int(1) NOT NULL, `rt` int(4) NOT NULL) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS `table2` ( `id` int(1) NOT NULL, `lt` int(1) NOT NULL, `rt` int(4) NOT NULL) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `table1` (`id`, `lt`, `rt`) VALUES (1, 1, 4);

INSERT INTO `table2` (`id`, `lt`, `rt`) VALUES (2, 2, 3);

1 Ответ

15 голосов
/ 22 апреля 2010

Ваш внутренний запрос является коррелированным подзапросом, но он вообще не видит table1.Это ограничение для MySQL - см. Руководство по MySQL - D.3.Ограничения на подзапросы .Примерно на полпути вниз говорится:

Подзапросы в предложении FROM не могут быть коррелированными подзапросами.Они материализуются (выполняются для создания результирующего набора) до оценки внешнего запроса, поэтому их нельзя оценить для каждой строки внешнего запроса.

Хотя подзапрос является частью выражения LEFT JOIN,является частью предложения FROM.

Эта переформулировка может помочь вам:

SELECT table1.id, 
       (SELECT COUNT(*) FROM table2 where table2.lt > table1.lt and table2.rt < table1.rt) as cnt
FROM table1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...