为什么我需要在自联接中使用别名?

cod*_*leb 0 sql join

我正在学习SQL,而且恰好让我感到困惑:

我有一张1柱(boys.boy),而男孩是varchar.

SELECT boys.boy, boys.boy 
FROM boys 
LEFT JOIN boys 
  ON length(boy) > length(boy)
Run Code Online (Sandbox Code Playgroud)

为什么我不能这样做?这会打破一些不变量,或者为什么发明者明确地引入了"自联合"?

换句话说,这是有效的("自我加入"):

SELECT b1.boy, b2.boy 
FROM boys AS b1 
INNER JOIN boys AS b2 
  ON length(b1.boy) > length(b2.boy)
Run Code Online (Sandbox Code Playgroud)

神奇之处在于别名(AS ......).

And*_*yev 7

在这种情况下,您必须使用别名.

否则服务器无法相互区分boys.boy,而这种结构

length(boy) > length(boy)
Run Code Online (Sandbox Code Playgroud)

很模糊 - 因为它可以被解释为

length(b1.boy) > length(b2.boy)
Run Code Online (Sandbox Code Playgroud)

要么

length(b2.boy) > length(b1.boy) 
Run Code Online (Sandbox Code Playgroud)

甚至

length(b1.boy) > length(b1.boy)
Run Code Online (Sandbox Code Playgroud)

更新

考虑这个简单的片段(这里使用的t-sql):

declare @boys table (boy nvarchar(128))

insert into @boys
select 'Ed'
union
select 'Tom'
union
select 'Nick'

select b1.boy, b2.boy
from @boys as b1
    left outer join @boys as b2 on len(b1.boy) > len(b2.boy)

select b1.boy, b2.boy
from @boys as b1
    left outer join @boys as b2 on len(b2.boy) > len(b1.boy)
Run Code Online (Sandbox Code Playgroud)

第一个查询的输出将是

Ed      NULL
Nick    Ed
Nick    Tom
Tom     Ed
Run Code Online (Sandbox Code Playgroud)

从第二个:

Ed      Nick
Ed      Tom
Nick    NULL
Tom     Nick
Run Code Online (Sandbox Code Playgroud)

说明:

我们来看看第一个查询.它基本上是:"从表中获取所有记录,并将每个记录与男孩名称长度小于该记录的所有其他记录相结合".这就是为什么越来越磨片Ed, Null对的-有一个具有名称的长度没有记录Ed了.

但是在第二个查询条件是"从表中获取所有记录并将每个记录与所有其他记录结合,其中男孩名称的长度大于该记录的长度".这就是为什么我们越来越对Ed, NickEd, Tom在这种情况下.

  • @TrudleR - 不,每个例子导致不同的结果.例如`length(b1.boy)> length(b1.boy)`不满足任何记录,其他例子也给出不同的结果. (3认同)
  • @TrudleR好吧,当加入表时 - 你有两组数据和一些连接条件.如果这个条件不明确 - 你无法确定,你应该如何加入数据集,不是吗?如何显示来自"右"表的数据 - 男孩栏的长度是大于还是小于"左"表? (2认同)