Неизвестный столбец {0} в предложении - PullRequest
0 голосов
/ 18 ноября 2009

Я делаю какую-то работу с базой данных MySQL и совершенно ошарашен при получении ошибки

1054 - Unknown column 'Puzzles.PuzzleID' in 'on clause'

И имена таблиц, и столбцы существуют и являются правильными. Я только что создал его в визуальном конструкторе Navicat.

SELECT
`PuzzleCategories`.`PuzzleCategory`,
`Clients`.`BusinessName`,
`Puzzles`.`PuzzleNumber`
FROM
`Puzzles`
Inner Join `PuzzleCategories` ON `Puzzles`.`PuzzleCategoryID` = `PuzzleCategories`.`PuzzleCategoryID` ,
`Clients`
Inner Join `Publications` ON `Clients`.`ClientID` = `Publications`.`ClientID`
Inner Join `PublicationIssues` ON `PublicationIssues`.`PublicationID` =     `Publications`.`PublicationID`
Inner Join `PuzzleUsages` ON `PuzzleUsages`.`PuzzleID` = `Puzzles`.`PuzzleID` AND `PuzzleUsages`.`PublicationIssueID` = `PublicationIssues`.`PublicationIssueID`

Ответы [ 2 ]

2 голосов
/ 18 ноября 2009

Я думаю, Puzzles не имеет столбца PuzzleID. Столбец называется просто ID в этой таблице? Или Puzzle_ID?

Вы должны запустить SHOW CREATE TABLE Puzzles, чтобы увидеть текущее определение этой таблицы.

Иногда виновной может быть пропущенная цитата:

... ON `Puzzles.PuzzleID` ...

Выше будет выглядеть столбец с буквальным названием "Puzzles.PuzzleID", то есть имя столбца длиной 16 символов с точкой в ​​середине.


@ Белл заслуживает награды за то, что заметил, что вы смешиваете соединения в стиле запятых и соединения в стиле SQL-92. Я этого не заметил!

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

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

SELECT . . . 
FROM (Puzzles JOIN PuzzleCategories),
(Clients JOIN Publications JOIN PublicationIssues JOIN PuzzleUsages)

Проблема в том, что соединение с PuzzleUsages должно сравниваться со столбцом Puzzles.PuzzleID, но из-за проблемы приоритета не может. Столбец не является частью операндов последнего JOIN.

Вы можете использовать круглые скобки для устранения ошибки, явно переопределяя приоритет табличных выражений (так же, как вы используете круглые скобки в арифметических выражениях):

SELECT . . . 
FROM Puzzles JOIN (PuzzleCategories, Clients)
JOIN Publications JOIN PublicationIssues JOIN PuzzleUsages

Или вы можете просто использовать синтаксис SQL-92 JOIN последовательно. Я согласен с @Bell, что это более понятно.

SELECT . . . 
FROM Puzzles JOIN PuzzleCategories JOIN Clients
JOIN Publications JOIN PublicationIssues JOIN PuzzleUsages
1 голос
/ 18 ноября 2009

Если вы уверены, что имена столбцов правильные, проблема может быть в порядке соединений. Похоже, что соединения каждой стороны запятой строятся отдельно. (Я не уверен, что это вероятно или даже возможно, но это единственное предположение, которое я основал на информации, которую вы предоставляете)

Запрос может быть реструктурирован как:


SELECT
`PuzzleCategories`.`PuzzleCategory`,
`Clients`.`BusinessName`,
`Puzzles`.`PuzzleNumber`
FROM
`Clients`
INNER JOIN `Publications` ON `Clients`.`ClientID` = `Publications`.`ClientID`
INNER JOIN `PublicationIssues` ON `PublicationIssues`.`PublicationID` =   `Publications`.`PublicationID`
INNER JOIN `PuzzleUsages` ON`PuzzleUsages`.`PublicationIssueID` = `PublicationIssues`.`PublicationIssueID`
INNER JOIN `Puzzles` ON `Puzzles`.`PuzzleID` = `PuzzleUsages`.`PuzzleID`
INNER JOIN `PuzzleCategories` ON `Puzzles`.`PuzzleCategoryID` = `PuzzleCategories`.`PuzzleCategoryID`

, который все равно лучше читается.

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