Неизвестная ошибка столбца при доступе к внешнему столбцу запроса внутри подзапроса - PullRequest
1 голос
/ 10 апреля 2020

Я не знаю, как объяснить мою проблему лучше, чем просто показать код и ошибку.
Следующий запрос является минимальным примером проблемы, с которой я столкнулся

UPDATE stops AS stops1 SET real_stop_id = (
    SELECT MIN(served_by2.stop_id)
    FROM served_by AS served_by1 
    INNER JOIN served_by AS served_by2
    USING(route_short_name)
    WHERE served_by1.stop_id = stops.stop_id
);

Возвращает следующая ошибка.

ERROR 1054 (42S22): Unknown column 'stops.stop_id' in 'where clause'

Я использую данные о расписании трамвайной сети моего города в формате спецификации транзитного канала Google
https://developers.google.com/transit/gtfs/reference

В дополнение к этому Я создал и заполнил таблицу served_by.

mysql> describe served_by;
+------------------+---------+------+-----+---------+-------+
| Field            | Type    | Null | Key | Default | Extra |
+------------------+---------+------+-----+---------+-------+
| stop_id          | int(11) | YES  |     | NULL    |       |
| route_short_name | text    | YES  |     | NULL    |       |
+------------------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> select * from served_by limit 5;
+---------+------------------+
| stop_id | route_short_name |
+---------+------------------+
|     378 | 19               |
|     378 | 19               |
|     378 | 19               |
|     378 | 19               |
|     398 | 5                |
+---------+------------------+
5 rows in set (0.06 sec)

Для полноты, вот таблица stops, которая соответствует формату GTFS, за исключением столбца real_stop_id (в котором нет данных), что я сейчас пытаюсь заселить.

mysql> describe stops;
+--------------+--------------+------+-----+---------+----------------+
| Field        | Type         | Null | Key | Default | Extra          |
+--------------+--------------+------+-----+---------+----------------+
| id           | int(11)      | NO   | PRI | NULL    | auto_increment |
| stop_id      | int(11)      | YES  | MUL | NULL    |                |
| real_stop_id | int(11)      | YES  |     | NULL    |                |
| stop_no      | varchar(30)  | YES  | MUL | NULL    |                |
| stop_name    | varchar(150) | YES  | MUL | NULL    |                |
| stop_lat     | double       | YES  |     | NULL    |                |
| stop_lon     | double       | YES  |     | NULL    |                |
+--------------+--------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)

mysql> select * from stops limit 5;
+----+---------+--------------+---------+--------------------------------------------+-------------------+------------------+
| id | stop_id | real_stop_id | stop_no | stop_name                                  | stop_lat          | stop_lon         |
+----+---------+--------------+---------+--------------------------------------------+-------------------+------------------+
|  1 |   10311 |          947 | 45      | 45-Glenferrie Rd/Wattletree Rd (Malvern)   |  -37.862296736384 | 145.028194441473 |
|  2 |   10371 |          946 | 44      | 44-Duncraig Ave/Wattletree Rd (Armadale)   | -37.8618932396197 | 145.025090664641 |
|  3 |    1083 |         1083 | 42      | 42-Clyde St/Raleigh Rd (Maribyrnong)       | -37.7696986370071 | 144.898841257316 |
|  4 |   11285 |          940 | 43      | 43-Egerton Rd/Wattletree Rd (Armadale)     | -37.8615917660895 |  145.02270030676 |
|  5 |    1185 |         1185 | 50      | 50-Vincent St/Wattletree Rd (Malvern East) | -37.8643850684538 |  145.04371198053 |
+----+---------+--------------+---------+--------------------------------------------+-------------------+------------------+
5 rows in set (0.06 sec)

1 Ответ

1 голос
/ 10 апреля 2020

Вы переименовали его в stops1. Вам нужно использовать псевдоним вместо исходного имени таблицы:

UPDATE stops s
     SET real_stop_id = (SELECT MIN(sb2.stop_id)
                         FROM served_by sb1 JOIN
                              served_by sb2
                              USING (route_short_name)
                         WHERE sb1.stop_id = s.stop_id
                        );

Я считаю, что аббревиатуры таблиц легче писать и читать.

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