使用 SQL 序数位置表示法的好处?
Posted
技术标签:
【中文标题】使用 SQL 序数位置表示法的好处?【英文标题】:Benefits Of Using SQL Ordinal Position Notation? 【发布时间】:2011-01-16 05:15:12 【问题描述】:背景资料
序数位置表示法,AKA ordinals,是基于SELECT
子句中列列表中列顺序的列简写,而不是列名或列别名。 ORDER BY
子句通常支持,一些数据库(mysql 3.23+、PostgreSQL 8.0+)也支持GROUP BY
子句的语法。
以下是使用序数的示例:
GROUP BY 1, 2
ORDER BY 1, 2
它不好用,因为它会使查询变得脆弱 - 如果列顺序发生变化,则需要更新序数,否则您的查询将不会返回您认为的结果。如果这些位置的列包含在聚合中,则很有可能在 GROUP BY
中使用时会出现错误...
问题
我能想到的唯一好处是通过网络发送的数据更少,如果您不使用存储过程或函数(这使得序数使用毫无意义,无论如何对我来说)。我还缺少其他好处吗?
【问题讨论】:
您多久更改一次列的顺序?为什么需要这样做? @FrustratedWithFormsDesigner:在客户的要求下,任何事情都可以并且将会改变。序数是一个维护问题——如果你把这个工作交给不熟悉 SQL 的人,他们可能会错过这个符号,然后乐趣就开始了。对我来说,性能的优先级略高于维护,因为它可能不会是我进行更新。 【参考方案1】:我会用它:
如果您喜欢故障排除 在没有智能感知的情况下创建即席查询没有任何好处。
无论如何,SQL Server 仅支持 ORDER BY。在其他任何地方,它都是要评估的表达式。
【讨论】:
Hpw 关于当 group by 语句在几十行长度时。在两个地方编码/维护有多有趣?这不是假设:我需要在 Spark 和 Hive Sql 中这样做。是的 - 这是 ansi 标准(因为投影发生在 after group by)。但是序数的基本原理现在应该很清楚了。【参考方案2】:当我查询一个包含很多列的表时(在 ad-hoc-land 中只是为了数据探索......我永远不会为 PROD 环境编写这样的代码)我会做这样的事情来获取字段我关心的是靠得更近:
select top 1000
Col_1, Col_18, Col_50, Col_117, *
from
TableWithTonsOfCols
order by
1, 4 desc, 3
如果我说order by Col_1, Col_117 desc, Col_50
我的查询会出错,因为由于“*”加倍,该语句不知道我打算按哪些列排序。不是很常见,但仍然是一个有用的功能。
【讨论】:
仅供参考:SQL Server 2005 引入了这种“barfing”以消除 ORDER BY 中的歧义。【参考方案3】:我的两个用例是:
我很着急不想打字,所以我使用序数。我总是将其转换为列名以供任何非临时使用 我订购的列是一个冗长的CASE
语句;我没有为ORDER BY
子句重新键入CASE
语句,而是使用保持它DRY 的序数。有一些方法可以解决这个问题,例如,使用 CTE、子查询或视图,但我经常发现序数是最简单的解决方案。
【讨论】:
就像我在对 Randy 的回答的评论中提到的那样,您可以使用ORDER BY
中的列别名。【参考方案4】:
我现在倾向于使用内嵌视图:
select col_a, count(*) from
(select case ...... end col_a from ...)
group by col_a
order by col_a;
但在它们成为有效语法之前的日子里,它确实有助于重新输入列的全文。对于棘手的功能,您可能会在 SELECT 和 ORDER BY 中的值之间出现差异,例如
select ltrim(col_name,'0123456789')
from table
order by ltrim(col_name,'123456789')
SELECT 中的“0”表示您没有按您选择的内容进行排序。
【讨论】:
【参考方案5】:我有一个查询生成算法 - SQL 是自动生成的。使用序数意味着我可以引用生成的字段而无需再次获取字段名称。用户可以通过从屏幕上的列表中选择来引用表格中的字段名称。只要我使列表与 sql 相对应,如果 SELECT 项也是序数,我将永远不需要知道字段名称。
内存说这曾经是 1970 年代后期的 SQL 标准
【讨论】:
【参考方案6】:如果我没记错的话,Microsoft 将在 SQL Server 的未来版本中弃用您所描述的序数。我可能是错的,但我认为情况就是这样。我一直喜欢在某些情况下使用它们,因为当您处理包含较长查询的派生列时,它涉及的输入更少。
【讨论】:
上帝,我希望如此。我没有遇到任何此类文档,如果您碰巧有链接,我会很高兴。对于计算列,我会参考ORDER BY
中的列别名 - 虽然通常无法帮助 GROUP BY
...
不推荐,但不反对:msdn.microsoft.com/en-us/library/ms188385.aspx以上是关于使用 SQL 序数位置表示法的好处?的主要内容,如果未能解决你的问题,请参考以下文章