макетировать и тестировать документ apache poi (wordDocument)

Не смешивать синтаксис соединения SQL-89 с «синтаксисом» в стиле «запятой» с синтаксисом SQL-92 JOIN. Есть тонкие проблемы с приоритетом этих двух типов операций объединения.

В вашем случае последствием является то, что он оценивает условие соединения LEFT JOIN до того, как существует псевдоним таблицы u. Вот почему он не знает, что такое u.usr_auto_key.

Вы можете исправить эту проблему, используя синтаксис JOIN для всех соединений:

SELECT 
  `u`.`usr_auto_key` AS `u__usr_auto_key`, 
  `s`.`set_auto_key` AS `s__set_auto_key`, 
  `u2`.`usr_auto_key` AS `u2__usr_auto_key`, 
  `u2`.`set_auto_key` AS `u2__set_auto_key`, 
  `u2`.`value` AS `u2__value` 
FROM `User` `u` JOIN `Setting` `s`
LEFT JOIN `User_Setting` `u2` ON `u`.`usr_auto_key` = `u2`.`usr_auto_key` 
WHERE (`s`.`sct_auto_key` = 1 AND `u`.`usr_auto_key` = 1 AND admin_property is null)

Я не видел какое-либо условие соединения между u и s в вашем запросе, поэтому я предполагаю, что вы намереваетесь, чтобы это было декартово произведение?


Подробнее о взаимодействии двух синтаксических форм для соединения , см. раздел Присоединение изменений обработки в MySQL 5.0.12 на странице http://dev.mysql.com/doc/refman/5.0/ru/join.html


Ваш комментарий: Как я уже сказал, это связано с приоритетом оператора. Если у вас есть запрос SQL с FROM A, B JOIN C, тогда он оценивает B JOIN C, прежде чем он обратит внимание на A, который включает назначение псевдонимов таблицы. Поэтому, если ваше условие соединения для B JOIN C использует псевдоним таблицы для A, вы получаете сообщение об ошибке, потому что этот псевдоним еще не существует.

Если вы отмените его и запустите B, A JOIN C, то при его оценке условие соединения для A JOIN C доступно для псевдонима для A, и оно работает (в этом случае, по крайней мере).

Но это хрупкое решение, потому что вам также может понадобиться запрос, t фиксируется только путем переупорядочения A и B. Лучше просто прекратить использование устаревшего синтаксиса соединения с запятыми. Тогда любое выражение объединения имеет доступ ко всем вашим псевдонимам таблицы, и вы никогда не будете иметь эту проблему в любом запросе.

0
задан Neninho 18 January 2019 в 12:27
поделиться