我有以下代码:
<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子句中重新定义列引用是否有任何技术或性能上的好处?这假定已经在提供给查询查询的数据库查询中显式设置了列引用。
我相信使用通配符运算符可以使代码更清晰,更容易更新,因为对列引用的任何更改只需要执行一次。
答案 0 :(得分:4)
正如您与Rahul讨论的那样:您的代码管理员&#34;如果这是一个基于数据库的查询,我会提供很好的建议,但我认为它在CFML查询查询的上下文中有点过分。
我怀疑他们已经在数据库查询的上下文中听到了指导,并且在为内存查询操作提供指导时并没有真正考虑过。
简而言之:您的代码比其所建议的更改更为优化。
答案 1 :(得分:1)
修改强>
正如所讨论的那样,是的,你的当前代码将更加模块化是正确的,因为它会在你的查询中包含任何更改(例如,如果你需要在所选列中进行更改),即它会处理您将来可能添加的任何列。因此,您目前的查询是有效的,并且可以继续进行。
如果要选择所有列,通配符肯定会处理它,但是现在不推荐使用它,并且通常不希望在选择列时使用通配符。你可以看看Aaron Bertrand Bad habits to kick : using SELECT * / omitting the column list:
但是有几个原因可以避免使用SELECT * 生产代码:
- 您可以返回只会被忽略的不必要数据, 因为你通常不需要每一列。这很浪费 在I / O中,因为您将从页面中读取所有这些数据, 或许你只需要从索引页面读取数据。 它在网络流量和许多情况下的内存中也是浪费 消费应用程序要求保存结果。
- 在连接中使用SELECT *时,可能会引入并发症 当多个表具有相同名称的列时(不仅仅是 连接的列,例如OrderID,通常是相同的, 还有像CreatedDate或Status这样的外围列。在一个 直接查询这可能没问题,但是当你尝试按顺序排序时 在这些列中,或者在CTE或派生表中使用查询 将需要进行调整。
- 虽然应用程序不依赖于顺序位置 结果集中的列,使用SELECT *将确保在您使用时 添加列或更改表中的列顺序,形状 结果集应该改变。理想情况下,这应该只会发生 故意。
醇>
答案 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>
你可以明智地利用你的时间,而你的代码管理员可能真的喜欢它。