Более читабельный способ написания следующего SQL-запроса - PullRequest
0 голосов
/ 03 ноября 2011

Итак, я прохожу класс DB Стэнфорда , и по одному из вопросов нам дают следующую базу данных . Теперь я уже заставил свой код работать, но он кажется мне ужасно неэффективным. Мы используем SQLite для выполнения наших запросов.

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

Следующее не является точным кодом как таковым, потому что я не хочу нарушать код чести. Тем не менее, у меня есть таблица средних значений, и везде, где средние значения отображаются ниже, я буквально копирую и вставляю весь запрос SELECT. Есть ли способ избежать этого?

SELECT avgbefore-avgafter
FROM

(SELECT avg(avgs) as avgbefore
FROM
Averages
WHERE year < 1980) as Before,

(SELECT avg(avgs) as avgafter
FROM
Averages
WHERE year >= 1980) as After

Ответы [ 2 ]

3 голосов
/ 03 ноября 2011

Я не знаю, поддерживает ли SQLite оператор ANSI CASE, но если он попытается сделать следующее:

SELECT avgbefore - avgafter
FROM ( 
    SELECT avg(CASE WHEN year < 1980 THEN avgs ELSE null END) as avgbefore,
           avg(CASE WHEN year >= 1980 THEN avgs ELSE null END) as avgafter
    FROM averages
) t

При этом используется тот факт, что значения NULL не учитываются агрегатными функциями.

1 голос
/ 03 ноября 2011

Это тот же запрос, который у вас уже есть, с небольшим изменением, которое он вычисляет непосредственно для подзапросов вместо использования предложения from для создания производных таблиц. Он не касается использования таблицы averages в нескольких местах, но, возможно, он немного более читабелен.

SELECT (SELECT AVG(avgs)
        FROM   averages
        WHERE  YEAR < 1980) - (SELECT AVG(avgs)
                               FROM   averages
                               WHERE  YEAR >= 1980)  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...