Несколько 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.