2014-09-06 2 views
7

Мы с другом играли с предложениями JOIN, доступными в MySQL. Вот структура таблицы мы имеем:Неизвестная ошибка столбца в полном синтаксисе соединения

create table abc 
(
    c1 int, 
    c2 char(1) 
); 
create table xyz 
(
    c2 char(1), 
    c3 varchar(5) 
); 

Значения, вставленные в них:

insert into abc 
values 
    (1,"a"), 
    (2,"b"); 
insert into xyz 
values 
    ("a","apple"), 
    ("c","car"); 

Теперь у меня есть following two SQL statements (sqlfiddle link):

select 
    *, 
    'full' 
from abc 
full join xyz 
    using (c2); 

и

select 
    *, 
    'full' 
from abc 
full join xyz 
    on abc.c2 = xyz.c2; 

Как можно видеть в скрипке, то первый запрос возвращает:

| C2 | C1 | C3 | FULL | 
|----|----|-------|------| 
| a | 1 | apple | full | 

в то время как второй запрос вызывает и ошибки:

Unknown column 'abc.c2' in 'on clause': 

Почему столбец abc.c2 не распознается при использовании ON положения о JOIN синтаксис?

+5

Когда же MySQL начал разрешать синтаксис FULL JOIN? Мой опыт в том, что синтаксис FULL JOIN не поддерживается. – Taryn

+0

Я не знаю, почему первый запрос даже запускается; поскольку bluefeet указал, что mysql не делает - afaik - поддерживает полное внешнее объединение. Если вы измените второй запрос на соединение слева или справа, он будет работать без ошибок. Более загадочным является то, почему на самом деле выполняется первый запрос, полное соединение с использованием. –

+0

Это, похоже, ошибка для MySql: когда ваш запрос снова запускается SQL Server ([demo 1] (http://sqlfiddle.com/#!3/10a05/3)) или Oracle ([demo 2] (http://sqlfiddle.com/#!4/e2a21/15)). – dasblinkenlight

ответ

11

FULL JOIN не поддерживается MySQL. Это потому, что full признан псевдонимом abc. Попробуйте этот запрос, он работает без ошибок:

select 
    *, 
    'full' 
from abc 
full join xyz 
    on full.c2 = xyz.c2; 
+5

Странно, что FULL даже не [зарезервированное слово] (https://dev.mysql.com/doc/refman/5.7/en/reserved-words.html) в текущем MySQL (5.7.x). – VMai

Смежные вопросы