Используя подзапрос переименовать столбцы


Это закономерность в запросах SQL, что я нашел себе последнее время повторяя:

SELECT
    w,
    x,
    y,
    (w + x) / y as z
FROM
  (SELECT
      <some gigantic and complicated query> as w,
      a + b as x,
      a - b as y
   FROM
      basetable) somealias;

Вопрос:

  • запрос SELECT, который делает несколько сложных операций, в результате чего в колонне с новым именем
  • прямое повторное использование "новых" колонка не работает в MySQL (не уверены о других РСУБД)

Этот код вызывает ошибку:

SELECT
    <some gigantic and complicated query> as w,
    a + b as x,
    a - b as y,
    (w + x) / y as z
FROM
    basetable;

Потому что MySQL не позволяет псевдонимы столбцов (х и Г), чтобы быть повторно использованы в том же Select запроса.


Решение я использую:

  • обернуть в подзапрос
  • это переименование столбцов
  • используйте новые имена столбцов внешнего запроса

Я не уверен в том, что это лучшая практика, или обычная практика, и, таким образом, легко понятным для других программистов.



2998
5
задан 23 ноября 2011 в 03:11 Источник Поделиться
Комментарии
2 ответа

Я думаю, что ваша практика хорошо. Здесь представлены два запроса и объяснять их результаты:

explain extended SELECT
w,
x,
y,
(w + x) / y as z
FROM
(SELECT
(SELECT SUM(s) FROM test2) as w,
a + b as x,
a - b as y
FROM
test) somealias;

+----+-------------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+------------+------+---------------+------+---------+------+------+----------+-------+
| 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 3 | 100.00 | |
| 2 | DERIVED | test | ALL | NULL | NULL | NULL | NULL | 3 | 100.00 | |
| 3 | SUBQUERY | test2 | ALL | NULL | NULL | NULL | NULL | 3 | 100.00 | |
+----+-------------+------------+------+---------------+------+---------+------+------+----------+-------+

explain extended SELECT 
(SELECT SUM(s) FROM test2) as w,
a + b as x,
a - b as y,
((SELECT SUM(s) FROM test2) + (a + b)) / (a -b) as z
FROM
test

+----+-------------+-------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+----------+-------+
| 1 | PRIMARY | test | ALL | NULL | NULL | NULL | NULL | 3 | 100.00 | |
| 3 | SUBQUERY | test2 | ALL | NULL | NULL | NULL | NULL | 3 | 100.00 | |
| 2 | SUBQUERY | test2 | ALL | NULL | NULL | NULL | NULL | 3 | 100.00 | |
+----+-------------+-------+------+---------------+------+---------+------+------+----------+-------+

Если я не ошибаюсь вторая версия работает в комплексе (может быть узким местом) подзапрос по таблице test2 на два раза, поэтому она должна быть медленнее, чем первый запрос, который запускает сложный вложенный запрос только один раз. Кроме того, первый намного легче читать. Поэтому, я предпочитаю первое. (Я не гуру в MySQL, не стесняйтесь, поправьте меня.)

3
ответ дан 23 ноября 2011 в 04:11 Источник Поделиться

Покуда переменные хорошо им, я думаю, что ваш путь (подзапрос) будет понятно, и поэтому вполне приемлемо, хотя я не совсем уверен, был ли это повлияет на производительность и в какой степени (попытка сравнительного анализа).

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

3
ответ дан 23 ноября 2011 в 04:11 Источник Поделиться