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;