2010-11-09 57 views
1

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

我问这个,因为我将整个数据行传递给我的DataModel,并通过将属性分配给连接到此数据行的itemarray中的不同索引来构造对象。如果这些字段出现乱码,我就不知道我的对象会发生什么。

我知道我不能依赖于一个视图内部的命令(在此之前被烧过)。但我不确定的领域顺序。

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

这些表格很小,所以我不担心在单个字段上使用*的含义。我只是想不编码不必要的语法。

+2

我通常会手动指定列名,除非我只是在SQL提示符下运行快速一次性查询。它让我知道(和SQL引擎知道)我的期望 - 也就是说,它增加了“契约”的明确性,并允许更快速地生成更有意义的错误。附加信息也可以用于修剪记录大小,从而节省传输成本等。如果“可读性”是一个问题,也许你还没有解决一个舒适的可读方式来编写SQL,否则阻碍了你的方式环境希望你表达查询。 – 2010-11-09 21:09:56

+0

+1 @pst - 优秀的答案。 – 2010-11-10 12:10:26

+0

我想也许我还没有解决一个舒适的方式来写我的SQL查询。当查询调用40个字段并跨越2行以上时,它很难在非宽屏显示器上阅读。在我的部门。我们保持“精益”的观点,或者至少尝试。视图中只包含必要的内容。如果您需要更多的信息,那么可能会有更多的数据(例如:每日统计数据与每小时统计数据)。这通常保持行#可接受,但有时会有一个荒谬的#字段。 – TWood 2010-11-10 15:31:30

回答

2

列顺序可以不被保证的或可靠的,如果这两个都为真

  • 视图定义已SELECT *SELECT tableA.*内部
  • 任何更改都向有关的表(多个)制成

您需要运行sp_refreshview:有关潜在问题,请参阅此question/answer

当然,如果在视图中有简单的SELECT * FROM table,为什么不直接使用表格并节省一些维护时间?

最后,我不得不说,这不是特别建议使用SELECT * ... :-)

+0

我的解释并不是视图被定义为'select * from table',而是OP想要在他的代码中使用'select * from view'。 – 2010-11-09 21:22:16

+0

@Joe Stefanelli:当然,但这是我的[宠物不喜欢](http://programmers.stackexchange.com/questions/14856/best-practices-that-you-disagree-with/14880#14880)当民间做这样的事情啊。得到它。尽我所能,让我的答案更加清晰。 – gbn 2010-11-09 21:24:33

+0

+1,特别是最后一句。 – 2010-11-10 12:06:18

1

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

例如Microsoft SQL - “*指定从在FROM子句所有表和视图的所有列应返回列由表或视图返回,如在FROM子句中指定,并且在为了在它们。存在于表格或视图中。“

+0

但是,正如gbn所注意到的,如果表的结构发生变化,那么'select *'返回的字段将会不同。 – 2010-11-10 12:07:51

+0

是的,在SQL选择中使用星号同时是一个很大的好处和一个很大的诅咒。但问题作者明确表示他并不担心这一点。 – RedGrittyBrick 2010-11-10 14:51:42

+0

并非如此--OP称“这些表格很小,所以我不担心在各个字段上使用*的含义”,这意味着额外的处理/带宽成本不是问题。 – 2010-11-10 15:32:18

4

列顺序是有保证的,行顺序(如您所注)不是。

+0

因此...... ** NO **用于行顺序:-)唯一的方法(一般情况下)*保证*行排序是在查询的*顶级*处使用ORDER BY子句。 (ORDER BY在视图中不被尊重,有些版本会拒绝它IIRC。) – 2010-11-09 21:07:11

+0

@pst:例如,SQL Server将在视图中拒绝一个'ORDER BY',除非你还包含一个'TOP'。 – 2010-11-09 21:12:48

+0

值得注意的是,这是受到表格更改和sp_refreshview等? – gbn 2010-11-09 21:20:32

2

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

+0

对于SQL而言,+1不是真正的关系型,但请参阅gbn对'select *'危险的回答。 – 2010-11-10 12:09:03

相关问题