Как объединить несколько запросов в один sql
Запросы в языке SQL комбинируются с помощью оператора UNION . Для этого необходимо указать каждый запрос SELECT и разместить между ними ключевое слово UNION . Ограничений по количеству использованного оператора UNION в одном общем запросе нет.
запрос 1> UNION запрос 2>
SELECT model, price FROM Cars UNION SELECT model, price FROM Bikes ORDER BY price DESC;
Объединение UNION
Для объединения результатов двух и более SQL-запросов SELECT в единую таблицу применяется ключевое слово UNION. Запросыдолжны возвращать одинаковое число и последовательность совместимых типов данных в соответствующих столбцах.
Синтаксис применения SQL запроса UNION
Оператор UNION размещается между SQL запросами :
select user_id, userName, phone from users UNION [ALL] select city_id, cityName, region from cities UNION [ALL] select company_id, companyName, address from companies
В представленном примере в одну кучу свалили информацию из трех таблиц, имеющих однотипные столбцы, что, конечно, неправильно, но это работает.
UNION весьма полезен в случаях, когда требуется получить консолидированную информацию, разделенную на несколько одинаковых таблиц, например рабочая и архивная таблицы. В этом случае, с использованием UNION можно извлекать данные, сгруппированные по годам и месяцам, включая и текущий период, а также получить полную информацию, связанную с определенным объектом.
UNION может быть использован совместно с оператором ALL для получения всех записей. Но необходимо отметить, что UNION ALL работает быстрее, чем просто UNION, поскольку при использовании оператора UNION проводится дополнительная фильтрация результата аналогичная SELECT DISTINCT, а при использовании UNION ALL — нет.
Правила применения UNION
При использовании UNION необходимо соблюдать несколько правил, регламентирующих порядок применения оператора :
- совместимость типов данных в соответствующих столбцах запросов;
- одинаковое число столбцов во всех объединяемых запросах;
- запрет пустых значений (NULL) в любом столбце объединения;
- нельзя использовать UNION в подзапросах.
Тип столбцов нескольких запросов может не совпадать, но обязательно должен быть совместимым путем неявного преобразования. Следует помнить, что столбцы с типом данных XML должны быть эквивалентными, т.е. тип столбцов должен быть определен либо в XML-схеме, либо быть нетипизированными. Типизированные столбцы должны относиться к одной и той же коллекции XML-схем.
Выборка из двух таблиц с использованием UNION
В качестве примера рассмотрим две простенькие таблицы (архивная и рабочая) без определения первичных и внешних ключей, индексов, ограничений на значения колонок и прочих «прелестей» SQL-языка. Допускаем, что в архивной таблице хранится информация о заказах за прошедшие годы. В рабочей таблице размещаются текущие продажи/заказы. Список товаров и услуг, входящих в заказ, не рассматриваем.
Архивная таблица заказов :
create table archive ( id int not null, -- идентификатор записи mid int not null, -- идентификатор менеджера year int not null, -- год month int not null, -- месяц total decimal(9,4) not null ); insert into archive (id, mid, year, month, total) values (1, 2, 2013, 1, 23500); insert into archive (id, mid, year, month, total) values (2, 2, 2013, 2, 11534); insert into archive (id, mid, year, month, total) values (3, 2, 2013, 3, 17532); insert into archive (id, mid, year, month, total) values (4, 2, 2013, 4, 23543); insert into archive (id, mid, year, month, total) values (5, 2, 2013, 5, 23245);
Рабочая таблица заказов :
create table orders ( id int not null, -- идентификатор заказа mid int not null, -- идентификатор менеджера total decimal(9,4) not null, data datetime not null ); insert into orders (id, mid, total, data) values (1, 1, 1350, '2014-02-23'); insert into orders (id, mid, total, data) values (2, 2, 3250, '2014-02-24');
Использование UNION ALL
Запрос выборки данных по продажам товаров (предоставлении услуг) по месяцам за весь период :
select CONCAT(CONVERT(year, CHAR (4)), '.', CAST(month as CHAR(2))) AS data, total from archive UNION ALL select CONVERT(DATE_FORMAT(data, '%Y.%m'), CHAR (7)), SUM(total) from orders GROUP BY DATE_FORMAT(data, '%Y.%m') order by 1;
Не следует относиться критично к конкатенации и функции преобразования даты; для различных СУБД это может различаться.
Результат выполнения запроса :
data total -------------------- 2013.1 23500.0000 2013.2 11534.0000 2013.3 17532.0000 2013.4 23543.0000 2013.5 23245.0000 2014.2 4600.0000
Использование UNION
Запрос выборки данных по продажам товаров (предоставлении услуг) по месяцам за весь период для определенного менеджера :
select CONCAT(CONVERT(year, CHAR (4)), '.', CAST(month as CHAR(2))) AS data, total from archive where mid = 2 UNION ALL select CONVERT(DATE_FORMAT(data, '%Y.%m'), CHAR (7)), SUM(total) from orders where mid = 2 GROUP BY DATE_FORMAT(data, '%Y.%m') order by 2;
Результат выполнения запроса :
data total -------------------- 2014.2 3250.0000 2013.2 11534.0000 2013.3 17532.0000 2013.5 23245.0000 2013.1 23500.0000 2013.4 23543.0000
Записи в результирующем наборе можно упорядочить с помощью одного или нескольких полей с использованием оператором ASC или DESC. Номер 1 и 2 в предложении ORDER BY указывает по какому столбцу результирующего набора будет упорядочен результат выборки.
Так как столбцы объединения — это столбцы вывода, они не имеют имен, и следовательно, должны определяться по номеру. Этот номер указывает на их место среди других столбцов вывода.
Внешнее объединение с UNION
При помощи UNION можно создавать полные внешние объединения :
SELECT e.id as eid, d.id as did, e.name as employee, d.name as department FROM employee e LEFT JOIN department d ON e.did = d.id UNION SELECT e.id as eid, d.id as did, e.name as employee, d.name as department FROM employee e RIGHT JOIN department d ON e.did = d.id;
Иногда в запросы вставляют дополнительное отладочное поле, чтобы понять к какому SELECT относится текущая запись набора.
SELECT e.id as eid, d.id as did, e.name as employee, d.name as department, 'first' FROM employee e LEFT JOIN department d ON e.did = d.id UNION SELECT e.id as eid, d.id as did, e.name as employee, d.name as department, 'second' FROM employee e RIGHT JOIN department d ON e.did = d.id;
Как результаты двух запросов MySQl объединить в одной таблице
Есть два запроса к двум таблицам plan и fact , отличающимся только одним полем plan и fact! Выборка делается по общему полю manager_ref. Как результаты запросов объединить в одну таблицу! UNION не работает из-за разного количества строк в результатах выборок.
SELECT u1.description as manager, u.description as partner, g.description as group_description, fa.description as functional_attribute_description, p.date, p.currency AS plan_currency, p.proceeds AS plan FROM `remote_test`.`plan` p LEFT JOIN groups g ON p.nomenclature_ref = g.ref LEFT JOIN functional_attribute fa ON p.functional_attribute_ref = fa.ref LEFT JOIN users u ON p.partner_ref = u.ref LEFT JOIN users u1 ON p.manager_ref = u1.ref WHERE p.manager_ref = 'ad7f5691-def9-4009-af54-1a91eada00ad' AND p.date = '2021-05-01' ORDER BY fa.description
Второй запрос
SELECT u1.description as manager, u.description as partner, g.description as group_description, fa.description as functional_attribute_description, f.date, f.currency AS fact_currency, f.proceeds AS fact FROM `remote_test`.`fact` f LEFT JOIN groups g ON f.nomenclature_ref = g.ref LEFT JOIN functional_attribute fa ON f.functional_attribute_ref = fa.ref LEFT JOIN users u ON f.partner_ref = u.ref LEFT JOIN users u1 ON f.manager_ref = u1.ref WHERE f.manager_ref = 'ad7f5691-def9-4009-af54-1a91eada00ad' AND f.date = '2021-05-01' ORDER BY fa.description
Как объединить результаты двух sql запросов
Есть две базы данных, нужно выполнить запрос1 к БД1 , затем полученные данные подставить в запрос2 к БД2 и результат запроса вывести в сводную таблицу. Нужно это все реализовать средствами VBA в Excel.
Заполнять данными сводную таблицу я научился, а вот с остальным нужна помощь.
Пользователь
Сообщений: 158 Регистрация: 20.10.2014
20.03.2017 13:15:03
Что вы подразумеваете под «полученные данные подставить в запрос2»?
Результат 1 запроса является условием ко 2-му запросу или просто «склеить» 2 выборки?
Пользователь
Сообщений: 6 Регистрация: 28.10.2015
20.03.2017 13:19:00
U_M0KRH, Результат 1 запроса является условием ко 2-му запросу. Если я правильно понимаю, то первый запрос мне нужно поместить в recodset, а затем обработать в цикле этот recodset и создать запрос2
Изменено: idShura — 20.03.2017 13:21:30
Сообщений: 22099 Регистрация: 28.12.2016
Excel 2013, 2016
20.03.2017 14:18:29
idShura, если например вам первый запрос выдает «пару строк» то да, по ним формируйте WHERE и запускайте второй запрос. Если нужен JOIN, то или временные таблицы или теоретически, но не проверял. FROM OPENDATSOURCE (а при возможности настроить LINKED SERVER то и FROM OPENQUERY ) .
По вопросам из тем форума, личку не читаю.
Пользователь
Сообщений: 11891 Регистрация: 22.12.2012
Excel 2016, 365
20.03.2017 14:58:08
Доброе время суток
| Цитата |
|---|
| БМВ написал: а при возможности настроить LINKED SERVER |
Михаил, а тогда зачем?
| Цитата |
|---|
| БМВ написал: FROM OPENQUERY |
Для двух SQL Server будет проще
From [serverName/instanceName].[DatabaseName].[TableName]
Сообщений: 22099 Регистрация: 28.12.2016
Excel 2013, 2016
20.03.2017 15:14:53
Андрей, в данном случае я на 100% теоретик 🙂 . Наверно для красоты 🙂
Offtop
И ваще я целый час ждал вашего вмешательства и . Где вы были с 13:11? Нет, я вас спрашиваю, где вы были с 13:11? . 🙂
По вопросам из тем форума, личку не читаю.
Пользователь
Сообщений: 141 Регистрация: 13.01.2014
21.03.2017 08:22:00
Чтоб быстрее все это сделать, воспользуйтесь https://vk.com/excelsql
Excel + SQL = Activetables
Сообщений: 22099 Регистрация: 28.12.2016
Excel 2013, 2016
21.03.2017 11:52:29
PowerBoy, Может хватит заниматься пиаром этой надстройки ( ранее ). Или продемонстируйте, как она упростит автору найти ответ на его вопрос.
По вопросам из тем форума, личку не читаю.
Пользователь
Сообщений: 11891 Регистрация: 22.12.2012
Excel 2016, 365
21.03.2017 14:14:43
Доброе время суток.
| Цитата |
|---|
| БМВ написал: Где вы были с 13:11? |
Михаил, а куда спешить? ТС всё равно мимо ходит — ни гу-гу.
Страницы: 1
Читают тему
© Николай Павлов, Planetaexcel, 2006-2023
info@planetaexcel.ru
Использование любых материалов сайта допускается строго с указанием прямой ссылки на источник, упоминанием названия сайта, имени автора и неизменности исходного текста и иллюстраций.
| ООО «Планета Эксел» ИНН 7735603520 ОГРН 1147746834949 |
ИП Павлов Николай Владимирович ИНН 633015842586 ОГРНИП 310633031600071 |