Пожалуйста, помогите с исправлением некоторого быстрого синтаксиса SQL, внутреннее объединение в новом столбце - PullRequest
1 голос
/ 27 июня 2010

Хорошо, скажем, что в MyTable существуют Col1, Col2 и COl3. Однако [Интервал] нет.

Select Col1,Col2,Col3, [Interval] = CASE
WHEN (cast(segstart as float) - floor(cast(segstart as float))) >= (cast(@TweleveAM as float) - floor(cast(@TweleveAM as float))) THEN CAST('0' as smallint) End
FROM MyTable

Но теперь я хочу использовать новый столбец, который я сделал в соединении, вот так

Inner Join NewTable New on Interval = New.starttime

Как мне это сделать? Я не могу найти правильный синтаксис

1 Ответ

2 голосов
/ 27 июня 2010

Большинство RMDBS не позволяют использовать псевдонимы столбцов в основной части непосредственного оператора SQL.Некоторые из них разрешают это в предложениях GROUP BY и HAVING.

Вы можете обойти это, используя подзапрос, но это может вызвать проблемы с производительностью.Лучше всего просто повторить уравнение.

В случае, если вам интересно, метод подзапроса будет выглядеть следующим образом:

SELECT
    col1,
    col2,
    col3,
    Interval
FROM
(
    SELECT
        col1,
        col2,
        col3,
        CASE
            WHEN CAST(segstart AS FLOAT) - FLOOR(CAST(segstart AS FLOAT)) >=
                 CAST(@TweleveAM AS FLOAT) - FLOOR(CAST(@TweleveAM AS FLOAT))
                 THEN CAST(0 AS SMALLINT)
        END AS interval
    FROM
        My_Table
) AS SQ
INNER JOIN New_Table NEW ON
    NEW.start_time = SQ.Interval

Другой вариант - использовать пользовательскую функцию(если вы используете MS SQL Server) или любой другой эквивалент в вашей РСУБД.Имейте в виду, что там также могут быть проблемы с производительностью, поэтому обязательно проверьте его на производительность.Это позволит вам сохранить уравнение в одном месте.

...