0
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
4

3 回答 3

3

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

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

所以你被降级为定期加入:

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才能执行此操作。而且我什至不确定它是否有效。

于 2013-04-19T19:56:08.740 回答
1

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

SELECT Distinct
   TableA.Column1,
   TableA.Column2,
   TableB.Column4
FROM
   TableA INNER JOIN TableB ON TableA.Column1 = TableB.Column3
于 2013-04-19T20:08:44.013 回答
1

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

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

如果要使用自然联接,则需要具有相同的列。

于 2013-04-19T19:56:22.583 回答