我可以依赖 sql 视图中的字段顺序吗?

Posted

技术标签:

【中文标题】我可以依赖 sql 视图中的字段顺序吗?【英文标题】:can I rely on the order of fields in a sql view? 【发布时间】:2010-11-09 21:00:03 【问题描述】:

如果我创建一个视图并按照我想要“接收”它们的顺序选择我的字段,我可以完全确定我可以从我的应用程序中调用“Select * from myView”,而不是再次指定所有字段名在我的选择查询中?

我问这个是因为我将整个数据行传递给我的 DataModel,并通过将属性分配给附加到该数据行的 itemarray 中的不同索引来构造对象。如果这些字段出现故障,我的对象可能会发生什么情况。

我知道我不能依赖一个存在于视图中的订单(之前在这个视图上被烧毁了)。但是我不确定字段的顺序。

对不起,如果这是 sql noob 级别。我们都从某个地方开始。现在,我的应用程序代码中所有无关的字段名称都使可读性变得有些困难,所以如果我可以安全地返回并用 * 替换很多语法,那就太好了。

这些表很小,所以我不担心在单个字段上使用 * 的影响。我只是希望不要编写不必要的语法。

【问题讨论】:

我通常手动指定列名,除非我只是在 SQL 提示符下运行快速一次性查询。它让我知道(并且 SQL 引擎知道)我的期望——也就是说,它增加了“合同”的明确性,并允许更快地生成更有意义的错误。额外的信息也可以用来减少记录的大小,从而节省传输成本等。如果“可读性”是一个问题,也许你还没有适应一种舒适的可读方式来编写 SQL,或者因为你的方式受到了阻碍。环境希望您表达查询。 我想也许我还没有适应一种舒适的方式来编写我的 sql 查询。当您的查询调用 40 多个字段并跨越 2 行以上时,在非宽屏显示器上很难阅读。在我的部门。我们保持“精益”观点,或者至少尝试这样做。视图中仅包含必要的内容。如果您在视图中需要更多信息,那么可能还有另一个可以提供更广泛的数据(即:每日统计数据与每小时统计数据)。这通常使第 # 行可以接受,但有时会有荒谬的 # 字段。 【参考方案1】:

保证列顺序,行顺序(如您所述)不是。

【讨论】:

So ... NO 用于行顺序 :-)保证行顺序的唯一方法(通常)是使用 ORDER BY 子句位于查询的***。 (ORDER BY 在视图中不被接受,某些版本会拒绝它 IIRC。) @pst:SQL Server 将拒绝视图中的ORDER BY,除非您还包含TOP 值得注意的是,这会受到表更改和 sp_refreshview 等的影响? @gbn:请参阅我对您的回答的评论。【参考方案2】:

如果这两个都为真,则列顺序可能无法保证或可靠

视图定义内部有SELECT *SELECT tableA.* 对相关表进行任何更改

您需要运行 sp_refreshview:请参阅question/answer 了解潜在问题。

当然,如果视图中有简单的SELECT * FROM table,为什么不直接使用表格,省去一些维护的痛苦呢?

最后,不得不说,不推荐使用SELECT *... :-)

【讨论】:

我的解释不是视图被定义为select * from table,而是OP想在他的代码中使用select * from view @Joe Stefanelli:当然,但当人们做这样的事情时,这是我的pet dislikes 之一......啊。得到它。我希望我的答案更清晰。 视图实际上非常复杂(不是我写的),并且使用了一些计算字段和函数,我似乎永远无法正确获取字段名。我们谈论的是 【参考方案3】:

是的,从左到右的列顺序在 SQL 中得到保证。事实上,它是用来证明 SQL 不是真正关系型的三大缺陷之一(例如,参见 The Importance of Column Names by Hugh Darwen)、重复行和 NULL 值是另外两个。

【讨论】:

+1 表示 SQL 不是真正的关系型,但请参阅 gbn 对select * 的危险的回答。【参考方案4】:

是的,我一直依赖 select * 按视图或表中指定的顺序返回字段。

例如Microsoft SQL - "* 指定应返回 FROM 子句中所有表和视图中的所有列。这些列由表或视图返回,如 FROM 子句中指定的那样,并按顺序返回它们存在于表或视图中。”

【讨论】:

但是,正如 gbn 所指出的,如果表的结构发生变化,那么select * 返回的字段将会不同。 是的,在 SQL 选择中使用星号既是一大福音,也是一大祸根。但问题作者明确表示他并不担心这一点。 不完全是 - OP 说“这些表很小,所以我不担心在单个字段上使用 * 的影响”,这意味着额外的处理/带宽成本不是问题。

以上是关于我可以依赖 sql 视图中的字段顺序吗?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server - 列顺序重要吗?

mysql查询表的列名,顺序不对?

SQL Server 数据库项目比较架构忽略同一表中的字段序列

SQL 行返回顺序

sql server 2005 一个索引多个字段,字段的排列顺序对搜索有啥影响??

sql语句中的关键字有优先级,以及执行顺序吗?