在SQL中自然连接

时间:2013-04-19 19:52:59

标签: sql join

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

3 个答案:

答案 0 :(得分:3)

支持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
;

你只需要咬紧牙关并编写查询。您可能不想编写列名,但那是不可能的

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

可能可以在视图或内联派生表中对列进行别名,但是您没有告诉我们您使用的是哪个特定的DBMS,因此我们可以回答其确切的功能。 可能看起来像这样:

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

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

答案 1 :(得分:1)

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

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

如果您想使用自然加入,则需要使用相同的列。

答案 2 :(得分:1)

'鲜明'语句也可以防止重复类似的行

SELECT Distinct
   TableA.Column1,
   TableA.Column2,
   TableB.Column4
FROM
   TableA INNER JOIN TableB ON TableA.Column1 = TableB.Column3
相关问题