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
答案 0 :(得分:3)
支持NATURAL JOIN
的DBMS要求连接键的列名匹配,如果执行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
;
你只需要咬紧牙关并编写查询。您可能不想编写列名,但那是不可能的。
一些注意事项:当你说“返回一个新表”时,我想我知道你的意思,但从技术上讲它是一个 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