неизвестный столбец в ошибке предложения on в mysql

#mysql

#mysql

Вопрос:

У меня есть две таблицы:

 mysql> select * FROM borrower;
 -------- ------------ --------- -------------- 
| cardno | name       | address | phone        |
 -------- ------------ --------- -------------- 
|      1 | A          | nj,usa  | 111-222-333 |
|      2 | B          | NY,USA  | 444-555-666 |
|      3 | C          | nj,usa  | 777-888-999 |
 -------- ------------ --------- -------------- 
3 rows in set (0.00 sec)

mysql> select * FROM bookloans;
 -------- ---------- -------- ------------ ------------ 
| bookid | branchid | cardno | dateout    | duedate    |
 -------- ---------- -------- ------------ ------------ 
|      1 |        1 |      1 | 2014-04-01 | 2014-08-01 |
 -------- ---------- -------- ------------ ------------ 
1 row in set (0.00 sec)
  

cardno в bookloans является внешним ключом для cardno в заемщике. C

Теперь я пытаюсь выполнить следующий SQL-запрос:

 mysql> select name,address from borrower full join bookloans
  on bookloans.cardno = borrower.cardno
  group by cardno having count(bookid)=0;
ERROR 1054 (42S22): Unknown column 'borrower.cardno' in 'on clause'
  

Я не понимаю ошибку, поскольку в таблице заемщиков есть столбец с именем cardno. Есть идеи, что я делаю не так?

Спасибо, Сунил

Ответ №1:

MySQL не поддерживает full join синтаксис. Итак, слово full в этом запросе интерпретируется как псевдоним таблицы, как если бы вы выполнили запрос типа:

 ... FROM borrower AS `full`
    JOIN bookloans ...
  

Затем, впоследствии, когда вы ссылаетесь borrower.cardno , это сбивает с толку, потому что он думал, что вы хотите сослаться на таблицу заемщиков, используя псевдоним full .

Я знаю, что это действительно глупая ошибка в анализаторе MySQL. Я зарегистрировал ошибку по этому поводу (http://bugs.mysql.com/bug.php?id=69858 ). Вы должны нажать «влияет на меня» на эту ошибку.

ОБНОВЛЕНИЕ: MySQL 8.0.31 наконец-то поддерживается FULL в качестве зарезервированного ключевого слова. MySQL по-прежнему не реализует полное внешнее объединение, но, по крайней мере, вы не будете удивлены этой ошибкой. Если вы действительно хотите использовать слово full в качестве псевдонима таблицы, вы должны выделить его (как если бы вы использовали любое другое зарезервированное ключевое слово в качестве идентификатора).


Повторите ваш комментарий:

Распространенный способ выполнить полное внешнее объединение в MySQL — это:

 SELECT ...
FROM borrower LEFT OUTER JOIN bookloans USING (cardno)
UNION
SELECT ...
FROM borrower RIGHT OUTER JOIN bookloans USING (cardno)
  

Однако, в вашем случае, я не думаю, что вам действительно нужно полное внешнее соединение. Вы используете GROUP BY COUNT(bookid) = 0 , поэтому кажется, что вы ищете левое внешнее соединение, где нет соответствующей строки в bookloans:

 SELECT name, address FROM borrower
LEFT OUTER JOIN bookloans USING (cardno)
WHERE bookloans.cardno IS NULL;
  

Комментарии:

1. значит, в mysql нет способа выполнить полное объединение?