使用SQL Server时必须注意的10个特性:不使用USING语句

日期: 2013-09-16 作者:Alex Bolenok 来源:TechTarget中国

使用SQL Server时必须注意的10个特性:不使用USING语句

 

SQL Server并不支持在连接中使用USING语句。

这一行为违反了标准并且是特定于SQL Server的。

USING语句允许你编写如下连接:

SELECT *

FROM mytable

JOIN othertable

USING (id)

也可以用以下查询代替:

SELECT *

FROM mytable m

JOIN othertable o

USING o.id = m.id

值得注意的是,这两个查询并不相同:第一个查询将只返回id一次。

这通常并不是什么大的问题,然而,一个FULL JOIN有时真的会有所帮助。

来看如下的一个PostgreSQL查询:

SELECT *

FROM table1

FULL JOIN

table2

USING (id)

FULL JOIN

table3

USING (id)

ORDER BY

id

LIMIT 10

这段查询很清楚的表明:它以id 的排序从任意三个表中获取前10条记录,并且如果需要就以空值填充另外两个表中潜在缺失的记录。

让我们尝试在SQL Server中做同样的事情如下:

SELECT TOP 10

*

FROM table1 t1

FULL JOIN

table2 t2

ON t2.id = t1.id

FULL JOIN

table3 t3

ON t3.id = COALESCE(t1.id, t2.id)

ORDER BY

COALESCE(t1.id, t2.id, t3.id)

如你所见,我们需要使用一个笨拙的COALESCE来做连接和排序,而用FULL JOIN让各个表能够在id字段产生一个空值。这同样会阻止优化器利用MERGE JOIN这种最快速的方法使所有的id字段都索引化。

要利用MERGE JOIN并从中获益,我们需要重写此查询如下:

SELECT *

FROM (

SELECT TOP 10

id

FROM (

SELECT id

FROM table1

UNION ALL

SELECT id

FROM table2

UNION

SELECT id

FROM table3

) q

ORDER BY

id

) q

LEFT JOIN

table1 t1

ON t1.id = q.id

LEFT JOIN

table2 t2

ON t2.id = q.id

LEFT JOIN

table3 t3

ON t3.id = q.id

SQL Server可以使用MERGE UNION来替代MERGE JOIN,起到的作用是相同的。

| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

相关推荐