Как вы разрешаете неоднозначные псевдонимы в MySQL в определениях текущей таблицы - PullRequest
2 голосов
/ 05 октября 2011

Мне было интересно, есть ли в MySQL какой-то псевдоним по умолчанию для текущей таблицы, которую вы строите (например, «self» в SmallTalk или «this» в Java).Например:

SELECT 
SUM(revenue) AS revenue,
SUM(units) AS units,
SUM(revenue)/SUM(units) AS revPerUnit,
-- I want to replace the above line with the below line:
self.revenue/self.units AS revPerUnit2
FROM inputTable;

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

Ответы [ 2 ]

3 голосов
/ 05 октября 2011

Обычно это то, что я делаю в следующих случаях:

SELECT revenue, 
       units, 
       revenue / units AS revperunit2 
FROM   (SELECT SUM(revenue) AS revenue, 
               SUM(units)   AS units 
        FROM   inputtable) subsel 

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

0 голосов
/ 06 октября 2011

То, что вы описываете, невозможно в SQL по очень конкретной причине.В списке SELECT все столбцы должны вычисляться (создаваться, разрешаться) одновременно или как если бы они рассчитывались (создавались, разрешались) одновременно.Или, другими словами, дать тот же результат в любом порядке, в котором они рассчитаны.

Это означает, что псевдоним столбца нельзя использовать (ссылаться) в вычислениях другого столбца.

Если то, что вы описали, было возможно, у нас могли бы быть циклические ссылки типа:

SELECT SUM(a)*sb AS sa
     , SUM(b)*sa AS sb 
FROM aTable

который, конечно, должен быть отклонен как ошибка.И это было бы довольно просто, если добавить в анализатор запросов уровень, который проверяет циклические ссылки (существует циклическая ссылка: отклонить запрос)

Но как рассчитать результат этого:

SELECT SUM(a) AS b
     , SUM(b) AS a
FROM aTable

или почему он должен быть отклонен?

Если в таблице нет столбцов a и b, хорошо, это было бы легко (существует циклическая ссылка: отклонить запрос).Но если есть столбцы a и b, это круговая ссылка или нет?Является ли b в SUM(b) неоднозначной ссылкой?Это относится к столбцу b или к псевдониму b?


Кстати, второй является допустимым запросом SQL.Поскольку SQL предполагает, что все вычисления выполнены (SUM(a) и SUM(b) здесь), а затем псевдонимы присваиваются результатам.То же самое происходит с:

UPDATE aTable
SET a=b
  , b=a

, который фактически меняет данные в двух столбцах.Когда ты пишешь это так, это не очень понятно, пока ты не попробуешь.Есть альтернативный, более красивый способ, который дает лучшее представление о том, что происходит в фоновом режиме (пока не все РСУБД поддерживают это):

UPDATE aTable
SET (a,b)=(b,a)
...