Почему мой столбец «неизвестен» при использовании FULL JOIN - PullRequest
0 голосов
/ 16 июня 2019

Я изучаю sql и хотел создать свои собственные таблицы для практики. Я нашел следующий сайт: https://sqltest.net/

Я создал две таблицы для практики соединений. Соединения LEFT / RIGHT / INNER прекрасно работают с созданными мной SQL-операторами, но когда я пытаюсь использовать FULL JOIN, появляется следующая ошибка:

Ouuuu snap '': Неизвестный столбец 'wizards.colours' в 'списке полей'

Это я что-то не так делаю или сбой на сайте?

CREATE TABLE wizards
(
colours varchar(255),
numbers int,
symbols varchar(255)
);

INSERT INTO wizards
VALUES ('red','49','£'),
       ('blue','83','$'),
       ('blue','72','£'),
('purple','24','%'),
       ('orange','82','$'),
       ('white','67',NULL),
('blue','17','%'),
       ('black','12','%'),
       ('green','97','&'),
('grey','1','%'),
       ('red','6','£'),
       ('red','76','%');

     CREATE TABLE warriors
(
colours varchar(255),
numbers int,
symbols varchar(255)
);  

INSERT INTO warriors
VALUES ('orange','59','£'),
       ('purple','2','£'),
       ('white','11','%'),
('blue','78','%'),
       ('grey','56','$'),
       ('red','5','%'),
('orange','92',NULL),
       ('green','50','$'),
       ('orange','49',NULL),
('red','1','%');

мое заявление sql:


SELECT wizards.colours, warriors.numbers, wizards.numbers
FROM wizards
FULL JOIN warriors ON wizards.colours=warriors.colours
ORDER BY wizards.colours;

Ответы [ 2 ]

2 голосов
/ 16 июня 2019

MySQL не поддерживает full join:

enter image description here

Вы можете использовать left + union + right join:

select * from (
    SELECT wizards.colours, warriors.numbers as warriors_numbers, wizards.numbers as wizards_numbers
    FROM wizards  
    LEFT JOIN warriors  ON wizards.colours=warriors.colours

    UNION

    SELECT wizards.colours, warriors.numbers as warriors_numbers, wizards.numbers as wizards_numbers
    FROM wizards  
    RIGHT JOIN warriors  ON wizards.colours=warriors.colours
) T
ORDER BY colours;

Онлайн-демонстрация на дБ <> fiddle

enter image description here

0 голосов
/ 16 июня 2019

MySQL не поддерживает FULL JOIN. Но взлом LEFT JOIN / RIGHT JOIN - не лучший способ его реализовать. Например, он не обрабатывает дубликаты правильно.

Лучший способ:

select cc.colours,
       wa.numbers, wi.numbers   -- whatever you want here
from ((select wi.colours 
       from wizards
      ) union  -- on purpose to remove duplicates
      (select wa.colours
       from warriors wa
      )
     ) c left join
     wizards wi
     on wi.colours = c.colours left join
     warriors wa
     on wa.colours = c.colours;

Даже это не эквивалентно на 100%, потому что он не обрабатывает NULL значения правильно. Тем не менее, это обычно дает правильное намерение. Вы можете исправить обработку NULL, изменив условия ON для использования NULL -безопасного сравнения, on (wi.colours <=> c.colours>.

Что более важно, вам не нужно FULL JOIN. Они почти никогда не нужны в правильно сформированной базе данных.

В этом случае это будет означать, что у вас есть таблица colours с правильно сформированными ограничениями внешнего ключа. Это часть моделирования отношений сущностей и правильный способ реализации таких связей.

...