【问题标题】:SQL: Using outer join in SQL Server 2012SQL:在 SQL Server 2012 中使用外连接
【发布时间】:2014-10-06 15:08:31
【问题描述】:

我正在尝试学习如何在 SQL Server 中使用 OUTER JOIN 函数,以便选择查询返回两个表中的所有值,甚至是不匹配的表。

这是我正在使用的两个示例表(男孩和女孩):

Boys:

Name    City
Andrew  Cape Town
Mike    Paphos
Simon   Amsterdam

Girls:

Name    City
Georgia Paphos
Megan   London
Eva     Amsterdam
Stephi  Cape Town

这是我写的查询:

SELECT boys.name, boys.city, girls.name, girls.city
    FROM boys, girls
    RIGHT OUTER JOIN boys as men ON boys.city=girls.city; 

我正在尝试按如下方式返回一个表:

boys.Name     boys.City        girls.name        girls.city    
Andrew        Cape Town        Stephi            Cape Town  
Mike          Paphos           Georgia           Paphos  
Simon         Amsterdam        Eva               Amsterdam  
NULL          NULL             Megan             London  

普通的内部连接会忽略最后一行,因为它没有匹配的男孩城市。

谁能帮我解决这个问题?

谢谢!

迈克

【问题讨论】:

  • FROM boys, girls 连接语法是较旧的语法(这个术语让我无法理解,atm)并使用隐式内部连接,这是您看不到所需结果的部分原因。
  • 你到底为什么要为每个性别准备一张桌子?
  • 只是一张废话表来说明我的问题
  • FROM boys, girls RIGHT OUTER JOIN boys - 嗯?此外,任何一个城市(例如开普敦)是否真的最多只能有一个男孩和最多一个女孩?如果开普敦有两个女孩和一个男孩,你会期待什么结果>?

标签: sql sql-server join sql-server-2012 outer-join


【解决方案1】:

您正在寻找双向的 FULL OUTER JOIN,而不是 RIGHT OUTER JOIN;

SELECT boys.name boys_name, boys.city boys_city,
       girls.name girls_name, girls.city girls_city
FROM boys
FULL OUTER JOIN girls 
  ON boys.city=girls.city

An SQLfiddle to test with.

您现有的查询将男孩连接两次,一次使用旧连接语法,一次使用右连接。使用完全外连接,您只需将每个表包含一次。

【讨论】:

    【解决方案2】:

    您可以在两张表上使用FULL OUTER JOIN

    您可以找到更多详细信息here

    例如:

    SELECT boys.name, boys.city, girls.name, girls.city
        FROM girls
        FULL OUTER JOIN boys ON boys.city=girls.city;  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-15
      • 2016-03-25
      • 1970-01-01
      • 2015-04-13
      • 2014-03-16
      • 1970-01-01
      • 1970-01-01
      • 2015-04-24
      相关资源
      最近更新 更多