Как уже говорилось, вероятная таблица в SQL запросе - это не фактическая таблица, а хранимый запрос или представление (как используется в других базах данных), к которому можно обращаться, как к таблице. При доступе возникает ошибка, потому что где-то в запросе вы ссылаетесь на дублирующееся поле без таблицы псевдонимов. Например, Customers и Orders таблиц могут иметь поле с именем CustomerID , и вы запустите эту форму:
SELECT CustomerID, ...
FROM Customers c
INNER JOIN Orders o
ON c.CustomerID = o.CustomerID
Или даже запустили эту запрос:
SELECT *
FROM Customers c
INNER JOIN Orders o
ON c.CustomerID = o.CustomerID
Затем в Python вы вызываете эту форму, которая вызывает ошибку из-за нескольких источников для CustomerID :
SELECT * FROM myStoredQuery
Почему возникла эта ошибка поднять сейчас, а не раньше? Потому что вы могли добавить столбцы с одинаковыми именами в базовые таблицы и затем использовать *
в SELECT
предложении верхнего запроса. Таким образом, любой новый столбец, добавленный к любой ссылочной таблице, включается в окончательный запрос.
Чтобы решить эту проблему, рассмотрите возможность наложения псевдонимов на любые возможные конфликты имен. И как рекомендовано в большинстве приложений, работающих SQL (за пределами Python):
Всегда явно указывайте столбцы в предложении SELECT
и не сокращайте их *
.
Всегда указывайте точку источника таблицы для столбцов, если в запросе указано несколько таблиц (т. Е. c.CustomerID
или o.CustomerID
), например, с соединениями.
См. Скорректированное значение SQL:
SELECT c.CustomerID AS Customer_CustomerID,
o.CustomerID AS Order_CustomerID,
...
FROM Customers c
INNER JOIN Orders o
ON c.CustomerID = o.CustomerID
Хотя запись каждого столбца кажется утомительной, это помогает поддерживать удобство обслуживания, поскольку вы контролируете и четко видите намеченный результат и учитываете реструктурированные изменения как новые, отброшенные, дублированные или специальные именованные столбцы. Возможно, вам не нужны все столбцы в Pandas, и вы можете опустить их в SELECT
.
И наконец, помните SQL - это декларативный язык специального назначения, предназначенный для отправки явных команд ядру базы данных в удобочитаемой форме для пользователя. Движок использует другой код для обработки запросов. Для Access / Jet / ACE Engine, являющегося Windows .dll, это может быть C или C ++.