Использование псевдонима в запросе и использование его - PullRequest
17 голосов
/ 13 января 2010

У меня есть сомнения и вопросы относительно псевдонима в SQL. Если я хочу использовать псевдоним в том же запросе, могу ли я его использовать. Например: Рассмотрим имя таблицы xyz со столбцами a и b

select (a/b) as temp , temp/5 from xyz

Возможно ли это как-то?

Ответы [ 5 ]

13 голосов
/ 13 января 2010

Вы говорите о присвоении идентификатора выражению в запросе, а затем о повторном использовании этого идентификатора в других частях запроса?

Это невозможно в Microsoft SQL Server, которым ограничен почти весь мой опыт работы с SQL. Но вы можете сделать следующее.

SELECT temp, temp / 5
FROM (
    SELECT (a/b) AS temp
    FROM xyz
) AS T1

Очевидно, что этот пример не особенно полезен, но если вы использовали выражение в нескольких местах, оно может быть более полезным. Это может пригодиться, когда выражения длинные, и вы тоже хотите сгруппировать их, потому что предложение GROUP BY требует от вас переформулировать выражение.

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

5 голосов
/ 13 января 2010

Вы также можете использовать оператор Oracle with. Аналогичные утверждения доступны и в других БД. Вот тот, который мы используем для Oracle.

with t
as (select a/b as temp
from xyz)
select temp, temp/5
from t
/

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

2 голосов
/ 13 января 2010

Невозможно в том же предложении SELECT, если ваш продукт SQL соответствует стандарту SQL-92 начального уровня.

Выражения (и их корреляционные имена) в предложении SELECT появляются «все сразу»; нет оценки слева направо, на которую вы, кажется, надеетесь.

В соответствии с ответом @Josh Einstein, вы можете использовать производную таблицу в качестве обходного пути (мы надеемся, что использование более значимого имени, чем «temp», и предоставление его для выражения temp/5 - имейте в виду человека, который унаследует ваш код).

Обратите внимание, что код, который вы разместили, будет работать с ядром базы данных MS Access (и назначит бессмысленное имя корреляции, такое как Expr1 вашему второму выражению), но опять же, это не настоящий продукт SQL.

1 голос
/ 07 октября 2014

Возможно, я думаю:

SELECT (A/B) as temp, (temp/5)
FROM xyz, 
(SELECT numerator_field as A, Denominator_field as B FROM xyz), 
(SELECT (numerator_field/denominator_field) as temp FROM xyz);
0 голосов
/ 13 января 2010

Вам может пригодиться W3Schools "SQL Alias" .

Вот пример из их урока:

SELECT po.OrderID, p.LastName, p.FirstName
FROM Persons AS p,
Product_Orders AS po
WHERE p.LastName='Hansen' AND p.FirstName='Ola'

Относительно использования псевдонима далее в запросе, в зависимости от базы данных, которую вы используете, это может быть возможно.

...