等联接返回重复列吗

时间:2020-09-23 13:45:32

标签: sql join

请考虑以下几点:

  1. 我们知道,inner join返回定义了连接条件的重复列。

  2. 我们知道natural join会删除重复项。

  3. 我知道我们可以使用等分联接:

    select * from table1, table2 where id1=id2
    

    select * from table1 join table2 on id1 = id2
    

我对第三点感到困惑。我想知道等值联接中返回的情况是什么?它是否返回重复的列,在该列中我们已经定义了连接条件,例如inner join

1 个答案:

答案 0 :(得分:1)

回答标题问题:是,如果您的查询使用SELECT *。当您专注于JOIN子句时,您会忘记有关SQL中SELECT子句的基础知识。

您的#3(您对 equi join 的定义)的方式等同于#1(inner join)。在#3中,使用WHERE的前者是较旧的,不加强调(ANSI-89)的隐式联接样式,而使用JOIN的后者是当前的标准(ANSI-92)显式联接。两者都返回相同的结果,应提供相同的性能,但可读性可能有所不同。 请参见 Explicit vs implicit SQL joins

在这些 equi-join 情况下收到重复列的原因是对{em> all 的 all 列的SELECT子句请求联接表,因为您没有限定星号,*

select * from table1 join table2 on id1 = id2

但是,仅使用星号是一种简便的缩写方法,但是建议的方法是通过选择特定的列来显式控制结果集。这对于需要列顺序和存在性的应用程序构建至关重要,并有助于提高代码的可读性和可维护性。 请参见 Why is SELECT * considered harmful?

下面是可用于避免重复列的示例:限定星号,子集/省略列,甚至使用别名对列进行重命名/重新排序。

-- ONLY table1 COLUMNS
select table1.* from table1 join table2 on id1 = id2

-- ONLY table2 COLUMNS
select table2.* from table1 join table2 on id1 = id2


-- SUBSET OF table1 AND table2 COLUMNS
select table1.Col1, table1.Col2, table1.Col3
     , table2.Col4, table2.Col5, table2.Col6 
from table1 
join table2 on id1 = id2


-- RENAMED COLUMNS
select table1.Col1 as t1_col1, table1.Col2 as t1_col2, table1.Col3 as t1_col3
     , table2.Col3 as t2_col3, table2.Col2 as t2_col2, table2.Col1 as t2_col1
from table1 
join table2 on id1 = id2