为什么使用 FULL JOIN 时我的列 'unknown'
Why is my column 'unknown' when using FULL JOIN
我正在学习 sql 并且想创建自己的表格来练习。我找到了以下网站:https://sqltest.net/
我创建了两个表来练习连接。 LEFT/RIGHT/INNER 加入我创建的 sql 语句工作正常,但是当我尝试使用 FULL JOIN 时出现以下错误:
Ouuuu 快照'':'field list'
中的未知列 '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;
MySQL不支持full join
:
您可以使用 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;
MySQL不支持FULL JOIN
。但是,LEFT JOIN
/RIGHT JOIN
hack 并不是 实现它的最佳方式。例如,它不能正确处理重复项。
更好的方法是:
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
值。但是,它通常能正确地表达意图。您可以通过更改 ON
条件以使用 NULL
安全比较 on (wi.colours <=> c.colours>
.
来修复 NULL
处理
更重要的是,您不需要 FULL JOIN
。在格式正确的数据库中几乎不需要它们。
在这种情况下,这意味着您有一个 colours
table 具有正确形成的外键约束。这是 entity-relationship 建模的一部分,也是实现此类关系的正确方法。
我正在学习 sql 并且想创建自己的表格来练习。我找到了以下网站:https://sqltest.net/
我创建了两个表来练习连接。 LEFT/RIGHT/INNER 加入我创建的 sql 语句工作正常,但是当我尝试使用 FULL JOIN 时出现以下错误:
Ouuuu 快照'':'field list'
中的未知列 '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;
MySQL不支持full join
:
您可以使用 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;
MySQL不支持FULL JOIN
。但是,LEFT JOIN
/RIGHT JOIN
hack 并不是 实现它的最佳方式。例如,它不能正确处理重复项。
更好的方法是:
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
值。但是,它通常能正确地表达意图。您可以通过更改 ON
条件以使用 NULL
安全比较 on (wi.colours <=> c.colours>
.
NULL
处理
更重要的是,您不需要 FULL JOIN
。在格式正确的数据库中几乎不需要它们。
在这种情况下,这意味着您有一个 colours
table 具有正确形成的外键约束。这是 entity-relationship 建模的一部分,也是实现此类关系的正确方法。