Несколько sql запросов в одном: Как объединить несколько запросов в один sql

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


Вопрос задан


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


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

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

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

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

Почта

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

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



Почта

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




By clicking “Отправить ответ”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.


python — Как выполнить сразу несколько запросов?


Вопрос задан


Изменён
1 год 9 месяцев назад


Просмотрен
602 раза

import cx_Oracle
cx_Oracle.init_oracle_client(lib_dir=r"")
hostname = ''
port = 
SID = 'xe'
username = 'demo'
password = 'demo'
dsn_tns = cx_Oracle.makedsn(hostname, port, SID)
try:
    conn = cx_Oracle.connect(user=username, password=password, dsn=dsn_tns)
except Exception as err:
    print('Exception occured while trying to create a connection', err)
else:
    try:
        cur = conn.cursor()
        sel_1 = """SELECT * FROM ORDERS WHERE STATUS = 'In process' AND CREATOR_ID = 3
AND CREATED_DT = '01-AUG-21' """
        sel_2 = """SELECT COUNT(status) FROM orders WHERE status = 'Closed'"""
        sel_3 = """SELECT FIO, department_name FROM employees e LEFT JOIN departments d
ON (d. department_id = e.department_id)"""
        sel_4 = """SELECT order_id, fio FROM orders o
        LEFT JOIN employees e ON(o.creator_id = e.employee_id)"""
        cur.executemany(sel_1,sel_2,sel_3,sel_4)
        rows = cur.fetchall()
        print(rows)
    except Exception as err:
        print('Excption occured while fetching the records', err)
    else:
        print('Completed')
    finally:
        cur.close()
finally:
    conn.close()

Выдает ошибку:

Excption occured while fetching the records an integer is required (got type str)

  • python
  • sql
  • cx-oracle

Метод cursor.executemany() предназначен для изменения данных (INSERT/UPDARE/DELETE). Идея в том, чтобы запускать один и тот же SQL запрос с разными значениями. Например:

qry = "INSERT INTO table_name (id, name) values(:1, :2)"
records = [(1, "John"), (2, "Jenny"), (3, "Abraham")]
cursor.executemany(qry, records)

В вашем случае, вам надо каждый запрос запускать отдельно и потом использовать cursor. fetchall() для того, чтобы вычитать все записи возвращенные единственным запросом:

cur.execute(sel_1)
for row in cur.fetchall():
    # processing row ...

потом обрабатываем следующий запрос:

cur.execute(sel_2)
for row in cur.fetchall():
    # processing row ...

и т.д.

Я не сильно шарю в питоне, но в ошибке написано что у вас стринг вместо интежера пытается достаться. Попробуйте составить запрос, в котором будет одинаковое количество столбцов и столбцы тоже одинаковые






1







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

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

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

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

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

Почта

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

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



Почта

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




By clicking “Отправить ответ”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.


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

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

спросил

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

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

Я хочу выбрать информацию из двух таблиц 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') AS 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') AS 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

В этом случае поможет объединение.

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

 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

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

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

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

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

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

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

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

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

Как объединить несколько запросов SQL?

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

спросил

Изменено
9 лет, 1 месяц назад

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

У меня возникли проблемы с поиском способа объединить два SQL-запроса в один, выражающий более важную идею.

Например, предположим, что у меня есть запрос A и запрос B. Запрос A возвращает общее количество отработанных часов. Запрос B возвращает общее количество часов, которые были доступны для работы работников. Каждый из этих запросов возвращает один столбец с одной строкой.

Чего я действительно хочу, так это, по сути, выполнить запрос A вместо запроса B. Я хочу знать процент использованной емкости.

Я знаю, как писать запросы A и B независимо друг от друга, но моя проблема возникает, когда я пытаюсь понять, как использовать эти предварительно написанные запросы для создания нового SQL-запроса, который использует их вместе. Я знаю, что на более высоком уровне, например, в отчете, я мог бы просто вызвать оба запроса, а затем разделить их, но я бы предпочел объединить все это в один SQL-запрос.

Я ищу общую идею о том, как объединить эти запросы с помощью SQL.

Спасибо!

1

Неограниченное СОЕДИНЕНИЕ, декартово произведение 1 строки на 1 строку

 SELECT обработано/доступно AS PercentageCapacity
FROM ( SELECT работал FROM A ),
     (ВЫБОР доступен ОТ B)
 

1

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

 DECLARE @first INT
DECLARE @second INT
SET @first = SELECT val FROM Table.