Я пытаюсь повторно использовать некоторые столбцы, которые я вычисляю динамически в Oracle SQL, что-то вроде
SELECT
A*2 AS P,
P+5 AS Q
FROM tablename
Где у 'tablename' есть столбец с именем 'A', но нет других столбцов. Это дает мне
ORA-00904: "P": invalid identifier
Я знаю, как обойти это, используя подзапрос, такой как
SELECT P, P+5 AS Q
FROM ( SELECT A*2 AS P FROM tablename )
но я думаю, что это некрасиво. Кроме того, я хочу сделать запрос несколько более сложным, например, повторное использование 'Q', и я не хочу создавать еще один подзапрос.
Обновление: причина, по которой я хочу сохранить вычисление «P», заключается в том, что я хочу сделать его более сложным и повторно использовать «P» несколько раз. Поэтому я не хочу явно говорить «A * 2 + 5 AS Q», потому что это быстро станет громоздким, когда «P» станет более сложным.
Должен быть хороший способ сделать это, есть идеи?
Обновление: я должен отметить, что я не администратор БД: (.
Обновление: пример из реальной жизни с более конкретным запросом. То, что я хотел бы сделать, это:
SELECT
SL/SQRT(AB) AS ALPHA,
5*LOG(10,ALPHA) AS B,
2.5*LOG(10,1-EXP(-5/ALPHA)*(5/ALPHA+1)) AS D
BS -2.74 + B + D AS BSA
FROM tablename
на данный момент, я выписал это, что работает, но уродливо:
SELECT
SL/SQRT(AB) AS ALPHA,
5*LOG(10,SL/SQRT(AB)) AS B,
2.5*LOG(10,1-EXP(-5/(SL/SQRT(AB)))*(5/(SL/SQRT(AB))+1)) AS D
BS -2.74 + 5*LOG(10,SL/SQRT(AB)) + 2.5*LOG(10,1-EXP(-5/(SL/SQRT(AB)))*((5/(SL/SQRT(AB)))+1)) AS BSA
FROM tablename
Я мог сделать все это после получения данных, но я подумал, давайте посмотрим, сколько я могу позволить базе данных сделать. Кроме того, я хотел бы также выбрать 'BSA' (что я могу теперь сделать с этим запросом как подзапрос / с предложением).
Обновление: хорошо, я думаю, что на данный момент я закончил с решением Cade Roux и Dave Costa. Хотя решение Pax 'и Jens Schauder выглядело бы лучше, но я не могу их использовать, так как я не администратор баз данных. Теперь я не знаю, кого пометить как лучший ответ:).
WITH
A1 AS (
SELECT A0.*,
SL/SQRT(AB) AS ALPHA
FROM tablename A0
),
A2 AS (
SELECT A1.*,
5*LOG(10,ALPHA) AS B,
2.5*LOG(10,1-EXP(-5/ALPHA)*((5/ALPHA)+1)) AS D
FROM A1
)
SELECT
ALPHA, B, D, BS,
BS -2.74 + B + D AS BSA
FROM A2
Кстати, в случае, если кому-то это интересно, SB - это «поверхностная яркость» галактик, для которых B и D. - поправочные члены.