Использование подстановочного оператора в запросе запроса

У меня есть следующий код:

<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>

Мой менеджер кода говорит, что мне нужно изменить Query of Query на:

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

Может кто-нибудь объяснить, почему мне нужно переопределить ссылки на столбцы в Query of Query? Конечно, оператор подстановки позаботится об этом.

Есть ли какой-то технический выигрыш или повышение производительности при переопределении ссылок на столбцы в предложении SELECT в Coldfusion Query of Queries? Это предполагает, что ссылки на столбцы уже были явно установлены в запросе к базе данных, который передается в Query of Queries.

Я считаю, что использование подстановочного оператора делает код чище и проще для обновления, потому что любые изменения в ссылках на столбцы нужно делать только один раз.

3 ответа

Решение

Как вы уже говорили с Рахулом: ваш "менеджер кода" предлагает хороший совет, если это был запрос на основе БД, но я думаю, что это несколько вопиюще в контексте запроса CFML по запросу.

Я подозреваю, что они слышали руководство в контексте запросов к БД и не достаточно продумали его, когда давали рекомендации по операциям запросов в памяти.

Короче говоря, ваш код более оптимален, чем тот, который предлагается.

РЕДАКТИРОВАТЬ:

Как уже говорилось, да, это правильно, что ваш текущий код будет более модульным, учитывая тот факт, что он будет включать любые изменения (например, если вам нужно внести изменения в выбранные столбцы) в ваш запрос, т. Е. Он позаботится о любые столбцы, которые вы можете добавить в будущем. Таким образом, ваш настоящий запрос эффективен и хорош для продолжения.


Подстановочный знак наверняка позаботится об этом, если вы хотите выбрать все столбцы, однако в настоящее время это не рекомендуется и обычно не предпочитают использовать подстановочный знак при выборе столбцов. Вы можете взглянуть на Aaron Bertrand. Плохие привычки бросать: используя SELECT * / опуская список столбцов:

Но есть несколько причин, по которым вам следует избегать SELECT * в производственном коде:

  1. Вы можете возвращать ненужные данные, которые будут просто проигнорированы, поскольку вам обычно не нужен каждый отдельный столбец. Это бесполезно при вводе / выводе, поскольку вы будете считывать все эти данные со страниц, когда, возможно, вам нужно было только прочитать данные со страниц индекса. Это также приводит к расточительству сетевого трафика и во многих случаях памяти, необходимой приложению-потребителю для хранения результатов.
  2. Когда вы используете SELECT * в объединении, вы можете создавать сложности, когда несколько таблиц имеют столбцы с одинаковыми именами (не только в соединенных столбцах, таких как OrderID, которые обычно одинаковы, но и в периферийных столбцах, таких как CreatedDate или Status). Для прямого запроса это может быть хорошо, но когда вы пытаетесь упорядочить по одному из этих столбцов или используете запрос в CTE или производной таблице, вам нужно будет внести коррективы.
  3. Хотя приложения не должны полагаться на порядковое положение столбцов в наборе результатов, использование SELECT * гарантирует, что при добавлении столбцов или изменении порядка столбцов в таблице форма набора результатов должна измениться. В идеале это должно происходить только намеренно.

Вот другой подход.

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

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

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

Вы можете использовать свое время с умом, и ваш менеджер кода может действительно понравится.

Другие вопросы по тегам