【问题标题】:Natural join on in SQLSQL中的自然连接
【发布时间】:2026-01-01 12:00:02
【问题描述】:
TableA                            TableB
Column1    Column2                Column3    Column4
1          2                      1          3

我有两个表 TableA(Column1,Column2) 和 TableB(Column3,Column4)。我想使用 column1、column4(LIKE NATURAL JOIN) 连接两个表。在 SQL 中有什么东西可以连接两个表并返回一个删除重复列的新表吗?

我要选择这个:

column1  column2  column4
1        2        3

【问题讨论】:

  • 我想要'在 tableA.column1 = tableB.column3 上的自然连接
  • 如果你加入A.Column1 = B.Column3,为什么在上面说Column1, Column4

标签: sql join


【解决方案1】:

支持NATURAL JOIN 的DBMS 要求连接键的列名匹配,如果您这样做SELECT *,您将只获得唯一的列名。尝试指定列名是没有意义的,因为整个事情都是通过相同的名称来工作的。

您必须在两个表之间有同名列,因为它将使用它们之间的每个同名列来执行连接。您的表 TableATableB 不适合自然连接,因为它们不共享任何列名。

因此,您只能进行常规连接:

SELECT
   A.*, -- you can at least get all the columns from one table
   B.Column4 -- but you have to specify the rest one at a time
FROM
   TableA A
   INNER JOIN TableB B
      ON A.Column1 = B.Column3
;

你只需要硬着头皮写下查询。您可能不想写列名,但这是不可能的

一些注意事项:当你说“返回一个新表”时,我想我知道你的意思,但从技术上讲,它是一个 行集,因为要成为一个表,它必须存储在有名字的数据库。

可能可以为视图或内联派生表中的列设置别名,但您没有告诉我们您使用的是什么特定的 DBMS,因此我们可以回答它的确切功能。它可能看起来像这样:

SELECT
   *
FROM
   TableA A
   NATURAL JOIN (
      SELECT Column1 = Column3, Column4
      FROM TableB B
   ) B
;

但请注意,您仍然必须列出TableB 中的所有其他 列才能执行此操作。而且我什至不确定它是否有效。

【讨论】:

  • 我不想写列名
  • 感谢@ErikE!那是我的问题
【解决方案2】:

连接两个表并查询部分或全部列不会返回一个新表而是记录集。要得到你想要的,试试这个。下面的查询遵循 SQL 标准,因此应该适用于所有 SQL 兼容的数据库。

SELECT ta.column1, ta.column2, tb.column4 from TableA ta INNER JOIN TableB tb ON     (ta.column1 = tb.column4)

如果你想使用自然连接,你需要有相同的列。

【讨论】:

    【解决方案3】:

    'Distinct' 语句也可以防止重复相似的行

    SELECT Distinct
       TableA.Column1,
       TableA.Column2,
       TableB.Column4
    FROM
       TableA INNER JOIN TableB ON TableA.Column1 = TableB.Column3
    

    【讨论】:

    • 我认识 Erik...我以为他会避免重复行...但作为答案,我也同意您的帖子。 (Table.* 或 Table.Column 或 'NATURAL JOIN' 语句)