sql — Вывод нескольких SELECT-ов в одну таблицу

Вопрос задан

Изменён 6 лет 3 месяца назад

Просмотрен 9k раза

Postgresql 9.2

Нужно все эти запросы ниже вывести в одну таблицу (собираю статистику)

SELECT "customer"."id", "customer"."email", "customer"."unsubscribed_types"
FROM
    "customer"
WHERE
    "customer"."unsubscribed_types" = 'daily_weekdays'
    OR "customer"."unsubscribed_types" = 'daily_weekends'
    OR "customer"."unsubscribed_types" = 'weekly_free'
    OR "customer"."unsubscribed_types" = 'weekly_best_weekly'
    OR "customer"."unsubscribed_types" = 'special_partner'
    OR "customer"."unsubscribed_types" = 'bonus_activation'
LIMIT 100;

SELECT
    "customer". email,
    "customer".id,
    "customer".unsubscribed_types
FROM
    "customer"
WHERE
    "customer".unsubscribed_types ISNULL
OR "customer".unsubscribed_types = '' 
LIMIT 100;

SELECT
    "customer".email,
    "customer".id,
    "customer".unsubscribed_types
FROM
    "customer"
WHERE
    "customer".unsubscribed_types = 'daily_weekdays'
    AND "customer".unsubscribed_types = 'daily_weekends'
    AND "customer".unsubscribed_types = 'weekly_free'
    AND "customer".unsubscribed_types = 'weekly_best_weekly'
    AND "customer".unsubscribed_types = 'special_partner'
    AND "customer".unsubscribed_types = 'bonus_activation';
    LIMIT 100;

SELECT
    "customer".id,
    "customer".email,
    "customer".unsubscribed_types
FROM
    "customer"
WHERE
    unsubscribed_types = 'daily_weekdays';
LIMIT 100;

Прошу заметить мне не объеденить а вывести статистику(например)

-------------------------------------------------
| Запрос 1 | Сколько нашел людей из 1-го селекта|
|-----------------------------------------------|
| Запрос 2 | Сколько нашел людей из 2-го селекта|
|-----------------------------------------------|
| Запрос 3 | Сколько нашел людей из 3-го селекта|
|-----------------------------------------------|
| Запрос 4 | Сколько нашел людей из 4-го селекта|
-------------------------------------------------
  • sql
  • postgresql
  • запрос-в-запросе

0

можно воспользоваться объединением запросов (union):

select "запрос 1", count(*)
from . .. where ...
union
select "запрос 2", count(*)
from ... where ...
union
...

Предложу такой вариант: Написать процедуру, в которой: 1) Будет создаваться таблица, определяющая Вашу результирующую таблицу 2) Делать выборки исходной таблицы 3) Проходится по каждой выборки и вставлять данные в таблицу, созданную в 1 пункте

Вот как решил проблему

SELECT
"request_1" AS "Запрос 1",
"request_2" AS "Запрос 2",
"request_3" AS "Запрос 3",
"request_4" AS "Запрос 4"
FROM
(
    -- Исполняем запрос 1
    SELECT count("customer"."id")
    FROM "customer"
    WHERE
        "customer"."unsubscribed_types" = 'daily_weekdays'
        OR "customer"."unsubscribed_types" = 'daily_weekends'
        OR "customer"."unsubscribed_types" = 'weekly_free'
        OR "customer"."unsubscribed_types" = 'weekly_best_weekly'
        OR "customer"."unsubscribed_types" = 'special_partner'
        OR "customer"."unsubscribed_types" = 'bonus_activation'
) AS "request_1",
(
    -- Исполняем запрос 2
    SELECT count("customer".
"id") FROM "customer" WHERE "customer"."unsubscribed_types" ISNULL OR "customer"."unsubscribed_types" = '{}' ) AS "request_2", ( -- Исполняем запрос 3 SELECT count("customer"."id") FROM "customer" WHERE "customer"."unsubscribed_types" = 'daily_weekdays' AND "customer"."unsubscribed_types" = 'daily_weekends' AND "customer"."unsubscribed_types" = 'weekly_free' AND "customer"."unsubscribed_types" = 'weekly_best_weekly' AND "customer"."unsubscribed_types" = 'special_partner' AND "customer"."unsubscribed_types" = 'bonus_activation' ) AS "request_3", ( -- Исполняем запрос 4 SELECT count("customer"."id") FROM "customer" WHERE "unsubscribed_types" = 'daily_weekdays' ) AS "request_4", ;

0

Зарегистрируйтесь или войдите

Регистрация через Google

Регистрация через Facebook

Регистрация через почту

Отправить без регистрации

Почта

Необходима, но никому не показывается

Отправить без регистрации

Почта

Необходима, но никому не показывается

Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки

Несколько операций над множеством строк в SQL запросе

Несколько операций над множеством строк в SQL запросе
  • 1. Введение

    • 1.1 Синтаксис SQL запроса

    • 1.2 Получение данных из таблицы

    • 1.3 Вызов функции

    • 1.4 Конкатенация строк

    • 1.5 Арифметические операции

    • 1.6 Исключение дубликатов

  • 2. Отсечение строк и сортировка

    • 2.1 Выражение WHERE

    • 2.2 Логические операторы

    • 2.3 Порядок условий

    • 2.4 Операции сравнения

    • 2.5 BETWEEN

    • 2.6 IN

    • 2.7 Поиск по шаблону

    • 2.8 Обработка NULL значений

    • 2.9 Сортировка

    • 2.10 Ограничение количества строк LIMIT

    • 2.11 Пропуск первых строк результата

  • 3. Соединения

    • 3.1 Соединение двух таблиц

    • 3.2 Псевдонимы таблиц

    • 3.3 Добавляем WHERE

    • 3.4 Несколько условий соединения

    • 3.5 Использование таблицы несколько раз

    • 3.6 Типы соединения

    • 3. 7 RIGHT JOIN

    • 3.8 FULL JOIN

    • 3.9 Декартово произведение

    • 3.10 Синтаксис через WHERE

  • 4. Агрегатные функции

    • 4.1 Агрегатные функции

    • 4.2 NULL значения в агрегатных функциях

    • 4.3 Количество уникальных значений

    • 4.4 Отсутствие строк

    • 4.5 GROUP BY

    • 4.6 Дополнительные столбцы в списке выборки с GROUP BY

    • 4.7 GROUP BY и WHERE

    • 4.8 GROUP BY по нескольким выражениям

    • 4.9 NULL значения в GROUP BY

    • 4.10 HAVING

    • 4.11 ROLLUP

    • 4.12 CUBE

    • 4.13 GROUPING SETS

  • 5. Операции над множествами

    • 5.1 Доступные операции над множествами

    • 5.2 Из какого запроса строка?

    • 5.3 Пересечение строк

    • 5.4 Исключение строк

    • 5.5 Дубликаты строк

    • 5.6 Совпадение типов данных столбцов

    • 5. 7 Сортировка

    • 5.8 Несколько операций

  • 6. Подзапросы

    • 6.1 Подзапрос одиночной строки

    • 6.2 Коррелированный подзапрос

    • 6.3 Подзапрос вернул более одной строки

    • 6.4 Подзапрос не вернул строк

    • 6.5 Попадание в список значений

    • 6.6 Отсутствие в списке значений

    • 6.7 NULL значения в NOT IN

    • 6.8 Проверка существования строки

    • 6.9 Проверка отсутствия строки

  • 7. Строковые функции

    • 7.1 CONCAT — конкатенация строк

    • 7.2 Преобразование регистра букв

    • 7.3 LENGTH — определение длины строки

    • 7.4 Извлечение подстроки

    • 7.5 POSITION — поиск подстроки

    • 7.6 Дополнение до определенной длины

    • 7.7 TRIM — удаление символов с начала и конца строки

    • 7.8 REPLACE — замена подстроки

    • 7.9 TRANSLATE — замена набора символов

  • 8. !)

  • 8.5 Получение числа из строки

  • 8.6 ROUND — округление числа

  • 8.7 TRUNC — усечение числа

  • 8.8 CEIL — следующее целое число

  • 8.9 FLOOR — предыдущее целое число

  • 8.10 GREATEST — определение большего числа

  • 8.11 LEAST — определение меньшего числа

  • 8.12 ABS — модуль числа

  • 8.13 TO_CHAR — форматирование числа

  • 9. Рекурсивные подзапросы

    • 9.1 Подзапрос во фразе FROM

    • 9.2 Введение в WITH

    • 9.3 Несколько подзапросов в WITH

    • 9.4 Простейший рекурсивный запрос

    • 9.5 Рекурсивный запрос посложнее

    • 9.6 Строим иерархию объектов

    • 9.7 Путь до элемента

    • 9.8 Сортировка (плохая)

    • 9.9 Сортировка (надежная)

    • 9.10 Форматирование иерархии

    • 9.11 Нумерация вложенных списков

    • 9.12 Листовые строки CONNECT_BY_ISLEAF

  • 10. Оконные функции

    • 10.1 Получение номера строки

    • 10.2 Номер строки в рамках группы

    • 10.3 Составляем рейтинг — RANK

    • 10.4 Несколько человек на место — DENSE_RANK

    • 10.5 Разделение на группы — NTILE

    • 10.6 Агрегатные оконные функции

    • 10.7 Обработка NULL значений

    • 10.8 Нарастающий итог SUM + ORDER BY

    • 10.9 Неуникальные значения в нарастающем итоге SUM + ORDER BY

    • 10.10 Собираем строки через разделитель — STRING_AGG

    • 10.11 WITHIN GROUP

    • Оглавление
    • Операции над множествами

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

    Рассмотрим пример. Есть три таблицы:

    SELECT *
      FROM table1
    
    SELECT *
      FROM table2
    
    SELECT *
      FROM table3
    

    Объединим строки трех таблиц

    SELECT * FROM table1
     UNION
    SELECT * FROM table2
     UNION
    SELECT * FROM table3
     ORDER BY value
    

    В случае использования INTERSECT и EXCEPT становится важным порядок выполнения операций над множествами строк. По умолчанию запросы выполняются последовательно сверху вниз. В нашем примере сначала будут объединены строки table1 и table2, затем к ним будут добавлены строки table3.

    Рассмотрим пример с EXCEPT.

    SELECT * FROM table1
     UNION
    SELECT * FROM table2
    EXCEPT
    SELECT * FROM table3
     ORDER BY value
    

    Сначала были объединены строки table1 и table2. В результате получились строки со значениями 1, 2, 3, 4. Затем из этих строк были исключены строки table3 1, 3 и 5.

    Порядок выполнения операций можно изменить с помощью скобок. Сначала исключим из table2 строки table3, затем объединим результат со строками table1.

    SELECT * FROM table1
     UNION
    (
      SELECT * FROM table2
      EXCEPT
      SELECT * FROM table3
    )
     ORDER BY value
    

    Из table2 (3, 4) исключаем строки table3 (1, 3, 5). В результате остается строка со значением 4. Затем к строкам  table1 (1, 2) добавляется строка со значением 4.

    • Практическое задание

      Несколько операций

    5.7 Сортировка

    6.1 Подзапрос одиночной строки

    Сделано ребятами из Сибири

    © 2023 LearnDB

    SQL: два оператора select в одном запросе

    Задавать вопрос

    спросил

    Изменено 1 месяц назад

    Просмотрено 498 тысяч раз

    Я хочу выбрать информацию из двух таблиц SQL в одном запросе, однако эта информация не связана, поэтому потенциальных соединений не существует.

    Примером может быть следующая установка.

    tblMadrid

     id | имя | игры | цели
        1 | роналду | 100 | 100
        2 | бензема | 50 | 25
        3 | тюк | 75 | 50
        4 | Кроос | 80 | 10
     

    тблБарселона

     ID | имя | игры | цели
        1 | неймар | 60 | 25
        2 | Месси | 150 | 200
        3 | Суарес | 80 | 80
        4 | иньеста | 40 | 5
     

    Я хочу получить запрос, который даст мне следующее:

     имя | игры | цели
    Месси | 150 | 200
    роналду | 100 | 100
     

    Я пытался следовать этой логике: Множественные операторы выбора в одном запросе, но следующий код не работал:

     USE Liga_BBVA
    ВЫБЕРИТЕ (ВЫБЕРИТЕ имя,
                   игры,
                   цели
            ОТ tblMadrid
            ГДЕ name = 'ronaldo') КАК table_a,
           (ВЫБЕРИТЕ имя,
                   игры,
                   цели
            ОТ tblBarcelona
            ГДЕ имя = 'messi') КАК table_b
    Упорядочить по целям
     

    Какой-нибудь совет по этому поводу? Спасибо Информация: Футбол — это просто упрощенный пример. На самом деле невозможно объединить обе таблицы в одну и создать новый столбец «команда». Две таблицы имеют совершенно разные структуры, но мне нужно что-то, что соответствует характеристикам этого примера.

    • sql
    • select

    Вы можете сделать что-то вроде этого:

     (SELECT
        имя, игры, голы
        ОТ tblMadrid ГДЕ имя = 'Роналду')
     СОЮЗ
     (ВЫБИРАТЬ
        имя, игры, голы
        ОТ tblBarcelona ГДЕ имя = 'месси')
    ЗАКАЗАТЬ ПО целям;
     

    См., например: https://dev.mysql.com/doc/refman/5.0/en/union.html

    1

    Если вам нравится вести записи отдельно и не делать объединение.
    Попробуйте выполнить запрос ниже

     ВЫБЕРИТЕ (ВЫБЕРИТЕ имя,
                   игры,
                   цели
            ОТ tblMadrid
            ГДЕ name = 'ronaldo') КАК table_a,
           (ВЫБЕРИТЕ имя,
                   игры,
                   цели
            ОТ tblBarcelona
            ГДЕ имя = 'messi') КАК table_b
    ОТ ДВОЙНОГО
     

    2

    Оператор UNION — ваш друг:

     SELECT a. playername, a.games, a.goals
    ОТ tblMadrid как
    ГДЕ a.playername = "ronaldo"
    СОЮЗ
    ВЫБЕРИТЕ b.имя игрока, b.игры, b.цели
    ОТ tblBarcelona as b
    ГДЕ b.playername = "месси"
    ЗАКАЗАТЬ ПО целям;
     

    0

    Вы можете объединить запросы, если столбцы совпадают.

     ВЫБЕРИТЕ имя,
           игры,
           цели
    ОТ tblMadrid
    ГДЕ идентификатор = 1
    СОЮЗ ВСЕХ
    ВЫБЕРИТЕ имя,
           игры,
           цели
    ОТ tblBarcelona
    ГДЕ идентификатор = 2
     

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

    MySQL

     select *
    от (
      выберите * из tblMadrid
      союз всех
      выберите * из tblBarcelona
    ) все данные
    сортировать по описанию целей
    предел 0,2;
     

    SQL Server

     выбрать верхние 2 *
    от (
      выберите * из tblMadrid
      союз всех
      выберите * из tblBarcelona
    ) все данные
    упорядочить по описанию целей;
     

    Если вам нужны только Месси и Роналду

     выберите * из tblBarcelona где name = 'messi'
    союз всех
    выберите * из tblMadrid, где name = 'ronaldo'
     

    Чтобы месси оказался вверху результата, можно сделать что-то вроде этого:

     select * from (
      выберите * из tblBarcelona, ​​где имя = 'messi'
      союз всех
      выберите * из tblMadrid, где name = 'ronaldo'
    ) звезды
    заказать по имени;
     

    2

     выберите имя, игры, голы
    из tblMadrid, где имя = «Роналду»
    союз
    выберите имя, игры, цели
    из tblBarcelona, ​​где name = 'messi'
    Упорядочить по целям
     

    1

    Использование union поможет в этом случае.

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

     select tmd .name,tbc.goals from tblMadrid tmd join tblBarcelona tbc on 1=1;
     

    объединение поможет вам даже в том случае, когда в таблицах нет общих столбцов

    0

    В этом случае вы можете использовать UNION

     выберите идентификатор, имя, игры, цели из tblMadrid
    союз
    выберите идентификатор, имя, игры, цели из tblBarcelona
     

    вы просто должны поддерживать порядок выбранных столбцов, т.е. идентификатор, имя, игры, цели в обоих SQL

    , как я вижу, вы хотите, чтобы большинство голов в каждой команде вы можете попробовать это

    выбрать имя, игры, макс (голы) как «большинство голов» из tblRealMadrid союз выберите name,games,max(goals) как «больше всего голов» из tblBarcelona

    В вашем случае две таблицы имеют совершенно разную структуру и не могут быть объединены.

    Можно использовать оператор UNION. Оператор UNION объединяет результаты двух или более операторов SELECT для создания единого результирующего набора. Первый столбец в операторе SELECT используется для сортировки результирующего набора.

     ВЫБЕРИТЕ имя, игры, цели
    ОТ tblMadrid
    ГДЕ имя = 'Роналдо'
    СОЮЗ
    ВЫБЕРИТЕ имя, игры, цели
    ОТ tblBarcelona
    ГДЕ имя = 'месси'
    ЗАКАЗАТЬ ПО целям;
     

    Каждый оператор SELECT должен иметь одинаковое количество совместимых столбцов и типов данных. Кроме того, если вы хотите сохранить дубликаты, используйте UNION ALL, а не UNION.

    Зарегистрируйтесь или войдите в систему

    Зарегистрируйтесь с помощью Google

    Зарегистрироваться через Facebook

    Зарегистрируйтесь, используя электронную почту и пароль

    Опубликовать как гость

    Электронная почта

    Обязательно, но не отображается

    Опубликовать как гость

    Электронная почта

    Требуется, но не отображается

    mysql — Несколько операторов выбора в одном запросе

    спросил

    Изменено 2 года, 8 месяцев назад

    Просмотрено 468 тысяч раз

    Я создаю отчет в php (mysql),

    ex:

     `выберите количество (id) как tot_user из user_table
     выберите count(id) как tot_cat из cat_table
     выберите count(id) как tot_course из course_table`
     

    Вот так у меня 12 таблиц.

    Могу ли я сделать это в одном запросе. Если бы я сделал? Процесс замедляется?

    1

     ВЫБЕРИТЕ (
        ВЫБЕРИТЕ КОЛИЧЕСТВО(*)
        ИЗ пользовательской_таблицы
    ) КАК tot_user,
    (
        ВЫБЕРИТЕ КОЛИЧЕСТВО(*)
        ОТ cat_table
    ) КАК tot_cat,
    (
        ВЫБЕРИТЕ КОЛИЧЕСТВО(*)
        ИЗ таблицы_курса
    ) КАК tot_course
     

    4

    Если вы используете таблицы MyISAM, самый быстрый способ — напрямую запросить статистику:

     выбрать имя_таблицы, строки_таблицы
         из information_schema.tables
    где
         table_schema = 'имя базы данных' и
         table_name в ('user_table','cat_table','course_table')
     

    Если у вас есть InnoDB, вы должны запросить с помощью count(), так как сообщенное значение в information_schema.tables неверно.

    1

    Вы, безусловно, можете использовать оператор Select Aggregation, как постулировано Беном Джеймсом, однако это приведет к представлению с таким количеством столбцов, сколько у вас есть таблиц. Альтернативный метод может быть следующим:

     ВЫБРАТЬ COUNT (user_table.id) AS TableCount, 'user_table' AS TableSource FROM user_table
    UNION SELECT COUNT(cat_table.id) AS TableCount, 'cat_table' AS TableSource FROM cat_table
    UNION SELECT COUNT(course_table.id) AS TableCount, 'course_table' AS TableSource From course_table;
     

    Преимущество такого подхода в том, что вы можете явно написать операторы Union и сгенерировать представление или создать временную таблицу для хранения значений, которые последовательно добавляются из процедурных вызовов, используя переменные вместо имен таблиц. Я больше склоняюсь к последнему, но это действительно зависит от личных предпочтений и области применения. Если вы уверены, что таблицы никогда не изменятся, вам нужны данные в формате одной строки, и вы не будете добавлять таблицы. придерживайтесь решения Бена Джеймса. В противном случае я бы посоветовал гибкость, вы всегда можете взломать структуру кросс-таблицы.

     выберите RTRIM(A. FIELD) из SCHEMA.TABLE A, где RTRIM(A.FIELD) = ('10544175A')
     СОЮЗ
    выберите RTRIM(A.FIELD) из SCHEMA.TABLE A, где RTRIM(A.FIELD) = ('10328189B')
     СОЮЗ
    выберите RTRIM(A.FIELD) из SCHEMA.TABLE A, где RTRIM(A.FIELD) = ('103498732H')
     

    2

     ВЫБЕРИТЕ t1.кредит,
           t2.дебет
    ОТ (ВЫБЕРИТЕ сумму (c.total_amount) КАК кредит
            ОТ кредита c
            ГДЕ c.status="a") КАК t1,
           (ВЫБЕРИТЕ сумму (d.total_amount) КАК дебет
            С дебета д
            ГДЕ d.status = "a") КАК t2
     

    Я знаю, что это старый стек, но я опубликую этот случай выбора Multi-SQL

     SELECT bp.bizid, bp.usrid, bp.website,
    ОКРУГЛ((ВЫБЕРИТЕ СУММУ(рейтинг) ИЗ оценок, ГДЕ bizid=bp.bizid)/(ВЫБЕРИТЕ СЧЕТ(*) ИЗ оценок, ГДЕ bizid=bp.bizid), 1) КАК «рейтинги»,
    (ВЫБЕРИТЕ COUNT(*) FROM bzreviews, ГДЕ bizid=bp.bizid) AS 'ttlreviews',
    bp.phoneno, als.bizname,
    (ВЫБЕРИТЕ СЧЕТ(*) ИЗ одобрения, ГДЕ bizid=bp.bizid) КАК «одобряет»
    , als.imgname, bp.