【问题标题】:SQL - not sure how to join tablesSQL - 不确定如何连接表
【发布时间】:2016-04-06 07:08:47
【问题描述】:

我正在尝试像这样加入两个表:

表 A

ID    Value1
1     A
2     B
3     C

表 B

ID    Value2
1     A
3     B
4     C

结果应该是:

ID    Value1  Value2
1     A       A
2     B       null
3     C       B
4     null    C 

即在 ID 上将表 A 连接到表 B。如果表 A 中不存在 ID,则添加表 B 中的 ID。

我最接近的是:

SELECT 
    a.ID, a.Value1, b.Value2 
FROM 
    TableA a 
OUTER JOIN 
    TableB b ON a.ID = b.ID

这给了我来自 TableB 的新行,但 ID 为空。

我怎样才能做到这一点?

【问题讨论】:

  • LEFT JOIN 是要走的路。
  • Left join 将无法获得预期的结果。
  • LEFT JOIN 不添加最后一行,它只是添加 Value2 列。 OUTER JOIN 添加 Value2 列和最后一行,但不添加该行中的 ID。
  • 什么具体的RDBMS是干什么用的? SQL 只是查询语言 - 但这并没有涵盖 SQL 标准的所有特定于供应商的扩展/解释......请添加相关标签,如 oraclesql-serverpostgresql、@987654328 @ 或您可能正在使用的其他任何内容....
  • @marc_s 对不起,是甲骨文。修复了标签。

标签: sql oracle


【解决方案1】:

你已经很接近了,你只需要朝正确的方向稍微推一下:

SELECT COALESCE(a.ID, B.ID) As ID, a.Value1, b.Value2 
FROM TableA a 
FULL OUTER JOIN TableB b ON a.ID=b.ID

COALESCE 函数返回它获取的第一个非空参数。由于这是一个完全外连接,a.id 将在一行上为空,b.id 在另一行上为空。

【讨论】:

  • FULL OUTER JOIN 并非在所有 DBMS 上都可用。
  • 这正是我所需要的!感谢您的快速回复。
  • @sagi 外连接和完全外连接基本相同,虽然最后一个更易读 IMO。如果 OP 使用外连接,他也应该能够使用完全外连接。我不知道任何支持outer join 但不支持full outer join 的数据库。
  • MySQL 支持LEFT OUTER JOIN 而不是FULL OUTER JOIN
  • @sagi 这不是我的问题。我询问了支持outer join 但不支持full outer join 的数据库。 left outer join 不等于 outer join
【解决方案2】:

试试这个:

SELECT *
FROM TableA A
FULL OUTER JOIN TableB B
ON A.ID = B.ID;

请注意:您不应在 SQL 中为表命名时包含空格。

【讨论】:

  • 将返回 4 列:id、id、value1、value2。
  • FULL OUTER JOIN 并非在所有 DBMS 上都可用。
【解决方案3】:

记住连接不同表的基本知识

SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name=table2.column_name;

对于您的情况:

SELECT a.value1, b.value2 
FROM TableA a 
FULL OUTER JOIN TableB b ON a.ID=b.ID

记住全外连接

FULL OUTER JOIN 关键字返回表 (tableA) 和表 (tableB) 中的所有行,而 FULL OUTER JOIN 关键字结合了 LEFT 和 RIGHT 连接的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    • 2011-08-25
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多