Несколько sql запросов в одном: fkn+antitotal | студентам & программистам
Содержание
sql — Вывод нескольких SELECT-ов в одну таблицу
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
Регистрация через почту
Отправить без регистрации
Почта
Необходима, но никому не показывается
Отправить без регистрации
Почта
Необходима, но никому не показывается
Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки
python — Как выполнить сразу несколько запросов?
Вопрос задан
Изменён
1 год 4 месяца назад
Просмотрен
455 раз
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
Регистрация через почту
Отправить без регистрации
Почта
Необходима, но никому не показывается
Отправить без регистрации
Почта
Необходима, но никому не показывается
Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки
SQL: два оператора select в одном запросе
Задавать вопрос
спросил
Изменено
3 месяца назад
Просмотрено
471 тысяч раз
Я хочу выбрать информацию из двух таблиц 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
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя электронную почту и пароль
Опубликовать как гость
Электронная почта
Обязательно, но не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
plsql — Как запустить несколько SQL-запросов?
спросил
Изменено
3 месяца назад
Просмотрено
105 тысяч раз
У меня есть запрос на создание таблицы, запрос на обновление и затем запрос на удаление таблицы. Мне нужно запустить эти три запроса за один раз. Как лучше всего это сделать?
Пример 1-й запрос: создайте таблицу A. 2-й запрос: обновить значение в таблице A 3-й запрос: удалить таблицу A.
Вместо того, чтобы выполнять эти три запроса один за другим, я хочу запускать их на ходу либо с помощью PLSQL, либо каким-либо другим способом. Пожалуйста помоги.
- sql
- plsql
5
Поместите 3 запроса друг за другом через точку с запятой:
SELECT * ОТ table_to_be_selected; DROP TABLE таблица_для_удаления; TRUNCATE TABLE table_to_be_truncated;
Вы можете объединить эти запросы в строку и выполнить эту строку.
0
Почему бы не создать ПРОЦЕДУРА
?
СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ПРОЦЕДУРУ foo
ЯВЛЯЕТСЯ
НАЧИНАТЬ
-- Здесь идет предложение создать. Например:
-- ВЫПОЛНИТЬ НЕМЕДЛЕННО
-- 'СОЗДАТЬ ТАБЛИЦУ bar (.