0

我有以下代码:

<cfquery name="somequery1" datasource="somedsn">
    SELECT somecolumn1, somecolumn2, somecolumn3 
    FROM sometable 
    WHERE someid = <cfqueryparam cfsqltype="cf_sql_integer" value="1">
</cfquery>

<cfquery name="somequery2" dbtype="query">
    SELECT *
    FROM somequery1
</cfquery>

我的代码经理说我需要将查询的查询更改为:

<cfquery name="somequery2" dbtype="query">
    SELECT somecolumn1, somecolumn2, somecolumn3 
    FROM somequery1
</cfquery>

有人可以解释为什么我需要重新定义查询中的列引用吗?当然,通配符运算符会处理这个问题。

在 Coldfusion Query of Queries 的 SELECT 子句中重新定义列引用是否有任何技术或性能增益?这假定列引用已在提供给查询查询的数据库查询中显式设置。

我相信通配符运算符的使用使代码更简洁,更容易更新,因为对列引用的任何更改只需要进行一次。

4

3 回答 3

4

正如您与 Rahul 讨论的那样:如果这是一个基于 DB 的查询,您的“代码管理器”会提供很好的建议,但我认为在 CFML 查询时查询的上下文中这有点令人震惊。

我怀疑他们已经听过数据库查询上下文中的指导,并且在提供有关内存查询操作的指导时并没有真正考虑过。

简而言之:您的代码比他们建议的更改更优化。

于 2015-09-23T07:27:48.920 回答
1

编辑:

正如所讨论的,是的,考虑到它将在查询中包含任何更改(例如,如果您需要在所选列中进行更改)这一事实,您当前的代码将更加模块化是正确的,即,它将处理您将来可能添加的任何列。因此,您当前的查询是有效的并且可以继续进行。


如果您想选择所有列,通配符肯定会处理它,但是现在不推荐并且通常不推荐在选择列时使用通配符。你可以看看 Aaron Bertrand踢坏习惯:使用 SELECT * / 省略列列表

但是在生产代码中应该避免使用 SELECT * 有几个原因:

  1. 您可能会返回将被忽略的不必要数据,因为您通常不需要每一列。这在 I/O 中是一种浪费,因为您将从页面中读取所有数据,而您可能只需要从索引页面中读取数据。它还浪费网络流量,并且在许多情况下消耗应用程序保存结果所需的内存。
  2. 当您在连接中使用 SELECT * 时,当多个表具有相同名称的列时,您可能会引入复杂性(不仅在连接列上,例如 OrderID,它们通常是相同的,而且在外围列上,例如 CreatedDate 或 Status)。在直接查询中这可能没问题,但是当您尝试按这些列之一排序,或在 CTE 或派生表中使用查询时,您将需要进行调整。
  3. 虽然应用程序不应依赖结果集中列的顺序位置,但使用 SELECT * 将确保当您在表中添加列或更改列顺序时,结果集的形状应该发生变化。理想情况下,这应该是有意发生的。
于 2015-09-23T06:37:14.080 回答
-1

这是另一种方法。

<cfset selectFields = "somecolumn1, somecolumn2, somecolumn3">

<cfquery name="somequery1" datasource="somedsn">
select #selectFields#
etc
</cfquery>

<cfquery name="somequery2" dbtype="query">
select #selectFields#
from somequery1
</cfquery>

你可以明智地利用你的时间,你的代码经理可能真的很喜欢它。

于 2015-09-23T16:27:36.490 回答