Intereting Posts
Когда использовать одиночные кавычки, двойные кавычки и обратные ссылки в MySQL Как читать этот текстовый файл и вставлять в MySQL? Каков наилучший способ скопировать подмножество строк таблицы из одной базы данных в другую в Postgres? Изменить первичный ключ Как получить последние 2 элемента для каждой категории в одном select (с mysql) PostgreSQL конвертирует столбцы в строки? Транспонирование? Уникальное ограничение на несколько полей в Access 2003 Сумма и цена по конкретному состоянию Найти предложения с двумя словами, смежными друг с другом в Pg Алиасы таблицы SQLite, влияющие на производительность запросов SQL: как запрос в sql-порядке, созданный в этом случае Несколько COUNT () для нескольких условий в одном запросе (MySQL) Unkillable сеанс Oracle, ожидающий события «SQL * Net сообщение от клиента» Есть ли встроенная в MySQL операция «появляется во всех» (с делением?)? Формат даты как день недели

SQL. Использовать результаты запроса в качестве основы для двух других запросов в одном выражении.

Я делаю расчет вероятности. У меня есть запрос, чтобы вычислить общее количество раз, когда происходит событие. Из этих событий я хочу получить количество раз, когда происходит суб-событие. Запрос для получения общих событий длится 25 строк, и я не хочу просто скопировать + вставить его дважды.

Я хочу сделать две вещи для этого запроса: вычислить количество строк в нем и рассчитать количество строк в результате запроса по этому запросу. Прямо сейчас, единственный способ, которым я могу думать об этом, – это (заменить @ total @ сложным запросом на получение всех строк, а @ conditions @ с менее сложными условиями, которые строки из @ total @ должны соответствовать суб-мероприятие):

SELECT (SELECT COUNT(*) FROM (@total@) AS t1 WHERE @conditions@) AS suboccurs, COUNT(*) AS totaloccurs FROM (@total@) as t2 

Как вы заметили, @ total @ повторяется дважды. Есть ли способ обойти это? Есть ли лучший способ сделать то, что я пытаюсь сделать?

Для повторного подчеркивания: @ conditions @ действительно зависит от того, что @ total @ возвращает (это похоже на t1.foo = bar ).

Некоторые заключительные примечания: @ total @ сам берет ~ 250 мс. Этот более сложный запрос занимает ~ 300 мс, поэтому postgres, вероятно, выполняет некоторую оптимизацию. Тем не менее, запрос выглядит ужасно уродливым, когда @ total @ буквально вставлен дважды.

 SELECT COUNT(*) as totaloccurs, COUNT(@conditions@) as suboccurs FROM (@total@ as t1) 

Если ваш sql поддерживает факторинг подзапроса, тогда переписывание его с помощью оператора WITH является опцией. Он позволяет использовать подзапросы более одного раза. С создаст их как встроенный просмотр, так и временную таблицу в Oracle.

Вот надуманный пример.

 WITH x AS ( SELECT this FROM THERE WHERE something is true ), y AS ( SELECT this-other-thing FROM somewhereelse WHERE something else is true ), z AS ( select count(*) k FROM X ) SELECT zk, y.*, x.* FROM x,y, z WHERE X.abc = Y.abc 

Поместите повторно используемый запрос в временную таблицу, затем выберите то, что вам нужно из таблицы temp.