我正在学习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 ......).
在这种情况下,您必须使用别名.
否则服务器无法相互区分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, Nick与Ed, Tom在这种情况下.
| 归档时间: |
|
| 查看次数: |
910 次 |
| 最近记录: |