#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 нет способа выполнить полное объединение?