在查询查询中使用通配符运算符

时间:2015-09-23 06:31:37

标签: sql coldfusion qoq

我有以下代码:

<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查询查询的SELECT子句中重新定义列引用是否有任何技术或性能上的好处?这假定已经在提供给查询查询的数据库查询中显式设置了列引用。

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

3 个答案:

答案 0 :(得分:4)

正如您与Rahul讨论的那样:您的代码管理员&#34;如果这是一个基于数据库的查询,我会提供很好的建议,但我认为它在CFML查询查询的上下文中有点过分。

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

简而言之:您的代码比其所建议的更改更为优化。

答案 1 :(得分:1)

修改

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

如果要选择所有列,通配符肯定会处理它,但是现在不推荐使用它,并且通常不希望在选择列时使用通配符。你可以看看Aaron Bertrand Bad habits to kick : using SELECT * / omitting the column list

  

但是有几个原因可以避免使用SELECT *   生产代码:

     
      
  1. 您可以返回只会被忽略的不必要数据,   因为你通常不需要每一列。这很浪费   在I / O中,因为您将从页面中读取所有这些数据,   或许你只需要从索引页面读取数据。   它在网络流量和许多情况下的内存中也是浪费   消费应用程序要求保存结果。
  2.   
  3. 在连接中使用SELECT *时,可能会引入并发症   当多个表具有相同名称的列时(不仅仅是   连接的列,例如OrderID,通常是相同的,   还有像CreatedDate或Status这样的外围列。在一个   直接查询这可能没问题,但是当你尝试按顺序排序时   在这些列中,或者在CTE或派生表中使用查询   将需要进行调整。
  4.   
  5. 虽然应用程序依赖于顺序位置   结果集中的列,使用SELECT *将确保在您使用时   添加列或更改表中的列顺序,形状   结果集应该改变。理想情况下,这应该只会发生   故意。
  6.   

答案 2 :(得分:-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>

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