Sql 如何正确使用完全外部联接的结果?
假设以下简化情况: 生日派对上提供两种游戏(飞镖和保龄球)。每场比赛每位客人的分数存储在单独的表格中:Sql 如何正确使用完全外部联接的结果?,sql,oracle,outer-join,Sql,Oracle,Outer Join,假设以下简化情况: 生日派对上提供两种游戏(飞镖和保龄球)。每场比赛每位客人的分数存储在单独的表格中: Darts: Bowling: Name | Dart-Score Name | Bowling-Score ------------------ -------------------- Alice | 120 Bob | 25 Tim | 9
Darts: Bowling:
Name | Dart-Score Name | Bowling-Score
------------------ --------------------
Alice | 120 Bob | 25
Tim | 90 Alice | 8
现在,我想像这样连接表(按名称排序):
我的做法如下:
select *
from Darts d full outer join Bowling b on (d.Name=b.Name)
order by Name;
这显然会引发错误,因为在联接表中,Name
是不明确的:
Darts.Name | Dart-Score | Bowling.Name | Bowling-Score
-------------------------------------------------------
Alice | 120 | Alice | 8
Tim | 90 | NULL | NULL
NULL | NULL | Bob | 25
此外,我不能订购,例如Darts.Name,因为有些值是NULL
。那么,如何按照完全外部联接的联接属性对结果进行排序呢?或者在这种情况下,外部连接是错误的方法吗
我的解决方案:
感谢@jarlh和@Radu Gheorghiu,我使用了以下查询:
select coalesce(d.Name,b.Name) Names, Dart-Score, Bowling-Score
from Darts d full outer join Bowling b on (d.Name=b.Name)
order by Names;
您可以通过NVL(d.Name,b.Name)
或COALESCE(d.Name,b.Name)
由于是完全联接,其中一列将有一个名称。通过使用NVL()
您将始终获得非空结果
在这种情况下,外部连接
是正确的方法
或者,您可以在内部创建一个完整的名称列表,并使用这两个表中的每个表进行左连接
,以在输出中创建一个公共名称
列
select a.Name, d.Dart-Score, b.Bowling-Score
from
(select name from Darts
UNION
select name from Bowling) a
LEFT JOIN
Darts d on a.Name = d.Name
LEFT JOIN
Bowling b on a.Name = b.Name
ORDER BY a.Name;
ORDER BY
可应用于联合列表。根据以下和执行查询:
--首先在查询中联合所有值并按名称分组:
create table Darts(id integer, Name varchar(25), DartScore integer);
create table Bowling(id integer, Name varchar(25), BowlingScore integer);
insert into Darts values(1, 'Alice',120);
insert into Darts values(1, 'Tim',90);
insert into Bowling values(1, 'Bob',25);
insert into Bowling values(1, 'Alice',8);
select name, DartScore, NULL as BowlingScore from Darts
union all
select name, NULL as DartScore, BowlingScore from Bowling;
select name, SUM(DartScore) as DartScore from Darts group by name;
select name, SUM(DartScore) as DartScore, SUM(BowlingScore) as BowlingScore
from (
select name, DartScore, NULL as BowlingScore from Darts
union all
select name, NULL as DartScore, BowlingScore from Bowling
)
group by name;
选择合并(d.Name,b.Name).
create table Darts(id integer, Name varchar(25), DartScore integer);
create table Bowling(id integer, Name varchar(25), BowlingScore integer);
insert into Darts values(1, 'Alice',120);
insert into Darts values(1, 'Tim',90);
insert into Bowling values(1, 'Bob',25);
insert into Bowling values(1, 'Alice',8);
select name, DartScore, NULL as BowlingScore from Darts
union all
select name, NULL as DartScore, BowlingScore from Bowling;
select name, SUM(DartScore) as DartScore from Darts group by name;
select name, SUM(DartScore) as DartScore, SUM(BowlingScore) as BowlingScore
from (
select name, DartScore, NULL as BowlingScore from Darts
union all
select name, NULL as DartScore, BowlingScore from Bowling
)
group by name;