Что быстрее join или union

Русские Блоги

Введение в разницу, использование и пример JOIN и UNION в SQL

JOIN используется для объединения двух таблиц в соответствии с условиями ON, в основном бывает четырех типов:
ВНУТРЕННЕЕ СОЕДИНЕНИЕ: записи в двух таблицах соединяются внутри.Только когда хотя бы одна строка, принадлежащая двум таблицам, удовлетворяет условию соединения, внутреннее соединение возвращает строку. Я понимаю, что до тех пор, пока запись не соответствует условию ON, она не будет отображаться в наборе результатов. к
LEFT JOIN / LEFT OUTER JOIN: Внешний объединяет записи в двух таблицах и включает все записи в левой таблице. Если запись левой таблицы не имеет соответствующей записи в правой таблице, все столбцы списка выбора правой таблицы в связанном наборе результатов пусты. Понятно, что даже если условие ВКЛ не выполняется, отображаются все записи в левой таблице, а правое поле таблицы этого типа записи в наборе результатов пусто. к
RIGHT JOIN / RIGHT OUTER JOIN: внешнее объединение записей в двух таблицах и включение всех записей в правой таблице. Проще говоря, это обратное LEFT JOIN. к
FULL JOIN / FULL OUTER JOIN: полное внешнее соединение возвращает все строки в левой и правой таблицах. То есть LEFT JOIN и RIGHT JOIN объединяются, и отображаются все данные левой и правой таблиц. к

Базовый синтаксис JOIN:
Select table1.* FROM table1 JOIN table2 ON table1.id=table2.id

Правое соединение правое соединение:

Объедините наборы результатов двух или более запросов в один набор результатов, содержащий все строки всех запросов в запросе объединения. Имя столбца набора результатов UNION такое же, как имя столбца набора результатов первого оператора Select в операторе UNION. Имя столбца результирующего набора другого оператора Select будет проигнорировано. к
Это два разных использования: UNION и UNION ALL. Разница в том, что UNION удаляет повторяющиеся строки из набора результатов. Если вы используете UNION ALL, все строки будут включены, а повторяющиеся строки не будут удалены. к

Разница между UNION и UNION ALL:

2. В следующем примере вы можете ясно увидеть и понять разницу между двумя
Пример 1 Типичная демонстрация двухметрового подключения

Предположим, есть две таблицы, Таблица1 и Таблица2, которые содержат столбцы и данные, как показано в Таблице 1.1 и Таблице 1.2 соответственно. к

Источник

В чем разница между JOIN и UNION?

ОТВЕТЫ

Ответ 1

аналогичный тривиальный пример JOIN :

Ответ 2

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

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

Операция UNION отличается от использования JOINs, которые объединяют столбцы из двух таблиц.

Ответ 3

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

UNION:

Оператор набора UNION используется для объединения данных из двух таблицы с колонками с одинаковым типом данных. Когда выполняется UNION, данные из обеих таблиц будут собранные в одном столбце с одинаковым типом данных.

Смотрите две таблицы, показанные ниже:

Теперь для выполнения типа JOIN запрос показан ниже.

UNION означает, что у вас есть таблицы или результаты с помощью то же количество и тип столбцов, и вы добавляете это в таблиц/результатов. Посмотрите на этот пример:

Ответ 4

Вы можете увидеть те же схематические объяснения для обоих, но они полностью запутывают.

Что быстрее join или union. Смотреть фото Что быстрее join или union. Смотреть картинку Что быстрее join или union. Картинка про Что быстрее join или union. Фото Что быстрее join или union

Что быстрее join или union. Смотреть фото Что быстрее join или union. Смотреть картинку Что быстрее join или union. Картинка про Что быстрее join или union. Фото Что быстрее join или union

Ответ 5

Это совершенно разные вещи.

A join позволяет связать похожие данные в разных таблицах.

Объединение возвращает результаты двух разных запросов в виде одного набора записей.

Ответ 6

Союз делает два запроса похожими на один. Соединения предназначены для проверки двух или более таблиц в одном заявлении запроса

Ответ 7

Соединения и союзы могут использоваться для объединения данных из одной или нескольких таблиц. Разница заключается в том, как данные объединяются.

В простых терминах объединяет данные в новые столбцы. Если две таблицы объединены вместе, то данные из первой таблицы отображаются в одном наборе столбцов рядом со столбцом вторых таблиц в той же строке.

Союзы объединяют данные в новые строки. Если две таблицы объединены вместе, то данные из первой таблицы находятся в одном наборе строк, а данные из второй таблицы в другом наборе, Строки имеют одинаковый результат.

Вот визуальное изображение соединения. Столбцы A и Bs объединены в один результат.

Что быстрее join или union. Смотреть фото Что быстрее join или union. Смотреть картинку Что быстрее join или union. Картинка про Что быстрее join или union. Фото Что быстрее join или union

Каждая строка в результате содержит столбцы из BOTH таблицы A и B. Строки создаются, когда столбцы из одной таблицы соответствуют столбцам из другого. Это совпадение называется условием объединения.

Это делает объединения действительно отличными для поиска значений и их включения в результаты. Обычно это результат денормализации (реверсирование нормализации) и предполагает использование внешнего ключа в одной таблице для поиска значений столбца с использованием первичного ключа в другом.

Теперь сравните приведенное выше изображение с изображением объединения. В объединении каждая строка в результате получается из одной таблицы ИЛИ другой. В объединении столбцы arent объединены для создания результатов, строки объединяются.

Что быстрее join или union. Смотреть фото Что быстрее join или union. Смотреть картинку Что быстрее join или union. Картинка про Что быстрее join или union. Фото Что быстрее join или union

Оба объединения и объединения могут использоваться для объединения данных из одной или нескольких таблиц в один результат. Они оба обходятся по-разному. В то время как объединение используется для объединения столбцов из разных таблиц, объединение используется для объединения строк.

Ответ 8

Соединения и объединения могут использоваться для объединения данных из одной или нескольких таблиц. Разница заключается в том, как данные объединяются.

В простых терминах объединения объединяют данные в новые столбцы. Если две таблицы объединены вместе, то данные из первой таблицы отображаются в одном наборе столбцов рядом со столбцом вторых таблиц в той же строке.

Союзы объединяют данные в новые строки. Если две таблицы объединены вместе, то данные из первой таблицы находятся в одном наборе строк, а данные из второй таблицы в другом наборе. Строки имеют одинаковый результат.

Ответ 9

Помните, что объединение объединит результаты (SQL Server, чтобы убедиться) (функция или ошибка?)

идентификатор, значение, идентификатор, значение

Ответ 10

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

например: таблица 1 заказчики/таблица 2 заказы

SELECT ID, NAME, AMOUNT, DATE

ВХОДНЫЕ ЗАКАЗЫ ВНУТРЕННЕГО СОБЫТИЯ

ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

SELECT ID, NAME, AMOUNT, DATE

ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID

ИДЕНТИФИКАТОР SELECT, NAME, AMOUNT, DATE ОТ КЛИЕНТОВ

ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

Ответ 11

Оператор UNION предназначен только для объединения двух или более операторов SELECT.

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

Обратитесь к здесь и здесь. Более хорошее объяснение с примерами.

Ответ 12

Любой современный DBS, например MariaDB, реализует команду UNION JOIN. Это команда SQL 3, но она не известна или не используется. Узнайте больше о UNION JOIN.

Ответ 13

В реферате они схожи, поскольку две таблицы или результирующие наборы объединяются, но UNION действительно предназначен для объединения наборов результатов с ТОЛЬКО КОЛИЧЕСТВО КОЛОНКИ с КОЛОНКАМИ, ИМЕЮЩИМИ ТАЙПИРОВАННЫЕ ТИПЫ ДАННЫХ. СТРУКТУРА такая же, добавляются только новые строки.

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

Источник

В чем разница между JOIN и UNION?

16 ответов

Аналогичный тривиальный пример JOIN :

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

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

Операция UNION отличается от использования JOIN, которые объединяют столбцы из двух таблиц.

Вы можете увидеть одни и те же схематические объяснения для обоих, но они полностью сбивают с толку.

Что быстрее join или union. Смотреть фото Что быстрее join или union. Смотреть картинку Что быстрее join или union. Картинка про Что быстрее join или union. Фото Что быстрее join или union

Что быстрее join или union. Смотреть фото Что быстрее join или union. Смотреть картинку Что быстрее join или union. Картинка про Что быстрее join или union. Фото Что быстрее join или union

ПРИСОЕДИНИТЬСЯ:

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

Оператор набора UNION используется для объединения данных из двух таблиц, которые имеют столбцы с одинаковым типом данных. При выполнении UNION данные из обеих таблиц будут собраны в один столбец с одинаковым типом данных.

См. Две таблицы, показанные ниже:

Теперь для выполнения типа JOIN запрос показан ниже.

СОЕДИНЕНИЕ означает, что у вас есть таблицы или набор результатов с одинаковым количеством и типом столбцов, и вы добавляете это в таблицы / наборы результатов вместе. Взгляните на этот пример:

Это совершенно разные вещи.

join позволяет связать похожие данные в разных таблицах.

Объединение возвращает результаты двух разных запросов как один набор записей.

Union делает два запроса похожими на один. Объединения предназначены для изучения двух или более таблиц в одном запросе.

Объединения и объединения можно использовать для объединения данных из одной или нескольких таблиц. Разница заключается в том, как объединяются данные.

Проще говоря, объединения объединяют данные в новые столбцы. Если две таблицы объединены вместе, то данные из первой таблицы отображаются в одном наборе столбцов рядом со столбцом второй таблицы в той же строке.

Помните, что объединение объединит результаты (SQL Server, чтобы быть уверенным) (функция или ошибка?)

Идентификатор, значение, идентификатор, значение

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

Например: таблица 1 клиенты / таблица 2 заказы

ВЫБЕРИТЕ ID, ИМЯ, СУММУ, ДАТУ

ЗАКАЗЫ НА ВНУТРЕННЕЕ СОЕДИНЕНИЕ

НА CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

ВЫБЕРИТЕ ID, ИМЯ, СУММУ, ДАТУ

ЛЕВЫЕ ЗАКАЗЫ НА СОЕДИНЕНИЕ

НА CUSTOMERS.ID = ORDERS.CUSTOMER_ID

ВЫБЕРИТЕ ИДЕНТИФИКАТОР, ИМЯ, КОЛИЧЕСТВО, ДАТУ ОТ КЛИЕНТОВ

ПРАВИЛЬНЫЕ ЗАКАЗЫ НА СОЕДИНЕНИЕ

НА CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

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

JOINs, вы можете извлекать данные из двух или более таблиц на основе логических отношений между таблицами.

Говоря абстрактно, они похожи в том, что объединяются две таблицы или наборы результатов, но на самом деле UNION предназначен для объединения наборов результатов с ОДИНАКОВЫМ ЧИСЛОМ КОЛОНК с СТОЛБЦАМИ, ИМЕЮЩИМИ ПОДОБНЫЕ ТИПЫ ДАННЫХ. СТРУКТУРА такая же, добавляются только новые строки.

В объединениях вы можете комбинировать таблицы / наборы результатов с любой возможной структурой, включая декартово соединение, в котором НЕТ общих / похожих столбцов.

Оператор UNION предназначен только для объединения двух или более операторов SELECT.

В то время как JOIN предназначен для выбора строк из каждой таблицы внутренним, внешним, левым или правым методом.

См. здесь и здесь. Есть лучшее объяснение с примерами.

JOIN и UNION делают разные вещи.

JOIN используется по горизонтали для создания таблицы путем объединения столбцов на основе некоторого отношения данных. Представление данных в более понятной и содержательной форме.

СОЕДИНЕНИЕ используется вертикально для «объединения / расширения» данных в таблице. Чтобы использовать UNION, вам нужно убедиться, что вы ВЫБИРАЕТЕ один и тот же номер столбца в каждом наборе данных и что они имеют один и тот же тип данных.

Что быстрее join или union. Смотреть фото Что быстрее join или union. Смотреть картинку Что быстрее join или union. Картинка про Что быстрее join или union. Фото Что быстрее join или union

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

Что быстрее join или union. Смотреть фото Что быстрее join или union. Смотреть картинку Что быстрее join или union. Картинка про Что быстрее join или union. Фото Что быстрее join или union

Что быстрее join или union. Смотреть фото Что быстрее join или union. Смотреть картинку Что быстрее join или union. Картинка про Что быстрее join или union. Фото Что быстрее join или union

Что быстрее join или union. Смотреть фото Что быстрее join или union. Смотреть картинку Что быстрее join или union. Картинка про Что быстрее join или union. Фото Что быстрее join или union

Как работает UNION, UNION ALL, EXCEPT, INTERSECT

Что быстрее join или union. Смотреть фото Что быстрее join или union. Смотреть картинку Что быстрее join или union. Картинка про Что быстрее join или union. Фото Что быстрее join или union

Объединения и объединения можно использовать для объединения данных из одной или нескольких таблиц. Разница заключается в том, как объединяются данные.

Вот визуальное изображение соединения. Столбцы таблиц A и B объединены в один результат.

Что быстрее join или union. Смотреть фото Что быстрее join или union. Смотреть картинку Что быстрее join или union. Картинка про Что быстрее join или union. Фото Что быстрее join или union

Каждая строка в результате содержит столбцы из ОБЕИХ таблиц A и B. Строки создаются, когда столбцы из одной таблицы соответствуют столбцам из другой. Это совпадение называется условием соединения.

Это делает объединения действительно удобными для поиска значений и включения их в результаты. Обычно это результат денормализации (обратной нормализации) и включает использование внешнего ключа в одной таблице для поиска значений столбцов с использованием первичного ключа в другой.

Теперь сравните приведенное выше изображение с изображением союза. В объединении каждая строка в результате берется из одной таблицы ИЛИ другой. В объединении столбцы не объединяются для создания результатов, строки объединяются.

Что быстрее join или union. Смотреть фото Что быстрее join или union. Смотреть картинку Что быстрее join или union. Картинка про Что быстрее join или union. Фото Что быстрее join или union

И объединения, и объединения можно использовать для объединения данных из одной или нескольких таблиц в один результат. Они оба поступают по-разному. В то время как соединение используется для объединения столбцов из разных таблиц, объединение используется для объединения строк.

Мне нравится думать об общем различии как о следующем:

Источник

Сравнение производительности с postgresql: left join vs union all

Я хочу знать, что является лучшим и самым быстрым решением между “левым внешним соединением” и “объединением всех”. База данных – PostgreSQL.

Запрос с UNION ALL:

Запрос с LEFT OUTER JOIN:

Ваши два запроса могут не дать тот же результат.

Хотя запрос с LEFT JOIN (то же, что и LEFT OUTER JOIN) возвращает строки, которые соответствуют плюс строки, которые не совпадают из-за любого не соответствующего значения.

В связи с этим запрос с LEFT JOIN более безопасен, если вы ожидаете увидеть все строки.

Возвращаясь к исходному вопросу, запрос с LEFT JOIN лучше всего подходит для использования индексов. Например, если вы хотите получить отсортированный результат, запрос UNION будет намного медленнее. Или, если ваш запрос является подзапросом в основном запросе, UNION предотвратит любую возможную эксплуатацию индексов таблицы [element]. Таким образом, будет медленным выполнение JOIN или WHERE такого подзапроса.

Я бы предложил LEFT OUTER JOIN над профсоюзом все в этом конкретном сценарии,

как и в союзе, вам нужно дважды читать таблицы, тогда как в LEFT OUTER JOIN только один раз

Возможно, LEFT JOIN, но вы можете увидеть план запроса, запустив EXPLAIN ANALYSE SELECT. Форма UNION ALL может быть более четкой, если вы изменяете столбцы на основе null-ness of elm_usr_id, но всегда можете использовать CASE для модификации столбцов с помощью LEFT JOIN.

Источник

Что быстрее join или union

Есть таблица A. Надо выбрать из нее все записи, на которые есть ссылки в таблицах B и C.
То есть, простейшее решение выглядит так:
select A.* from A inner join B on B.a = A.a
union
select A.* from A inner join C on C.a = A.a

Но мне надо, чтобы селект был только один, причем таблицы в запрос могут добавляться только через join’ы.
Эти ограничения накладывает Hibernate Criteria API. Я сначала составляю Criteria, который является обвязкой запроса, потом отдаю его, и запросивший этот Criteria может добавить еще условия по своему выбору.
В общем, можно как-либо сделать один селект через джойны заместо нескольких селектов с union?

Что быстрее join или union. Смотреть фото Что быстрее join или union. Смотреть картинку Что быстрее join или union. Картинка про Что быстрее join или union. Фото Что быстрее join или unionОт: Romanzek
Дата:31.07.09 13:54
Оценка:

Здравствуйте, Donz, Вы писали:

D>Есть таблица A. Надо выбрать из нее все записи, на которые есть ссылки в таблицах B и C.
D>То есть, простейшее решение выглядит так:
D>select A.* from A inner join B on B.a = A.a
D>union
D>select A.* from A inner join C on C.a = A.a

D>Но мне надо, чтобы селект был только один, причем таблицы в запрос могут добавляться только через join’ы.
D>Эти ограничения накладывает Hibernate Criteria API. Я сначала составляю Criteria, который является обвязкой запроса, потом отдаю его, и запросивший этот Criteria может добавить еще условия по своему выбору.
D>В общем, можно как-либо сделать один селект через джойны заместо нескольких селектов с union?

Здравствуйте, Donz, Вы писали:

D>Есть таблица A. Надо выбрать из нее все записи, на которые есть ссылки в таблицах B и C.
D>То есть, простейшее решение выглядит так:
D>select A.* from A inner join B on B.a = A.a
D>union
D>select A.* from A inner join C on C.a = A.a

select A.* from A. left join B on B.a = A.a left join C on C.a = A.a
where notNull(B.a) and notNull(C.a)

не помню как на null проверять

Что быстрее join или union. Смотреть фото Что быстрее join или union. Смотреть картинку Что быстрее join или union. Картинка про Что быстрее join или union. Фото Что быстрее join или unionОт: Romanzek
Дата:31.07.09 15:09
Оценка: 8 (1)

Здравствуйте, cvetkov, Вы писали:

C>Здравствуйте, Donz, Вы писали:

D>>Есть таблица A. Надо выбрать из нее все записи, на которые есть ссылки в таблицах B и C.
D>>То есть, простейшее решение выглядит так:
D>>select A.* from A inner join B on B.a = A.a
D>>union
D>>select A.* from A inner join C on C.a = A.a

C>select A.* from A. left join B on B.a = A.a left join C on C.a = A.a
C>where notNull(B.a) and notNull(C.a)

C>не помню как на null проверять

В данном случае проще написать
select A.* from A. join B on B.a = A.a join C on C.a = A.a
Результат будет тот же. Это работает для случая B и C, причем полным эквивалентом union будет не всегда — если в таблицах B или С есть несколько ссылок на A, то будет замножение результата. Нужен distinct или group by.

Для случая B ИЛИ C нужно писать
select distinct(A.a) from A left join B on B.a = A.a left join C on C.a = A.a
where B.a is not null or C.a is not null

Что быстрее join или union. Смотреть фото Что быстрее join или union. Смотреть картинку Что быстрее join или union. Картинка про Что быстрее join или union. Фото Что быстрее join или unionОт: elmal
Дата:31.07.09 15:41
Оценка:

Здравствуйте, Donz, Вы писали:

D>В общем, можно как-либо сделать один селект через джойны заместо нескольких селектов с union?
Не знаю, правильно ли, но я последний раз делал так — (сразу на HQL, специально открыл исходники, на перфоманс вроде жалоб нет)

У меня joinов было 6, таким образом заработало гораздо шустрее, чем в случае с left join (тогда жалобы были на перфоманс Что быстрее join или union. Смотреть фото Что быстрее join или union. Смотреть картинку Что быстрее join или union. Картинка про Что быстрее join или union. Фото Что быстрее join или union).
Когда-то кажется делал другим способом, и кажется без in, но напрочь забыл, и это осталось в другом проекте:
что-то вроде

Увы, запросы я много писал более 4-х лет назад, сейчас один запрос в полгода максимум.

Что быстрее join или union. Смотреть фото Что быстрее join или union. Смотреть картинку Что быстрее join или union. Картинка про Что быстрее join или union. Фото Что быстрее join или unionОт: svanir
Дата:31.07.09 16:25
Оценка:

Здравствуйте, Donz, Вы писали:

D>Есть таблица A. Надо выбрать из нее все записи, на которые есть ссылки в таблицах B и C.
D>То есть, простейшее решение выглядит так:
D>select A.* from A inner join B on B.a = A.a
D>union
D>select A.* from A inner join C on C.a = A.a

D>Но мне надо, чтобы селект был только один, причем таблицы в запрос могут добавляться только через join’ы.
D>Эти ограничения накладывает Hibernate Criteria API. Я сначала составляю Criteria, который является обвязкой запроса, потом отдаю его, и запросивший этот Criteria может добавить еще условия по своему выбору.
D>В общем, можно как-либо сделать один селект через джойны заместо нескольких селектов с union?

А почему нельзя так:
select A.* from A inner join B on B.a = A.a
inner join C on C.a=A.a
?
и почему Вы берете «все» только из А?

Что быстрее join или union. Смотреть фото Что быстрее join или union. Смотреть картинку Что быстрее join или union. Картинка про Что быстрее join или union. Фото Что быстрее join или unionОт: elmal
Дата:31.07.09 17:32
Оценка: +1
Что быстрее join или union. Смотреть фото Что быстрее join или union. Смотреть картинку Что быстрее join или union. Картинка про Что быстрее join или union. Фото Что быстрее join или unionОт: Lloyd
Дата:31.07.09 17:53
Оценка: 8 (1)

Здравствуйте, Donz, Вы писали:

D>В общем, можно как-либо сделать один селект через джойны заместо нескольких селектов с union?

Что быстрее join или union. Смотреть фото Что быстрее join или union. Смотреть картинку Что быстрее join или union. Картинка про Что быстрее join или union. Фото Что быстрее join или unionОт: elmal
Дата:31.07.09 18:22
Оценка:
Что быстрее join или union. Смотреть фото Что быстрее join или union. Смотреть картинку Что быстрее join или union. Картинка про Что быстрее join или union. Фото Что быстрее join или unionОт: Lloyd
Дата:31.07.09 20:55
Оценка: 1 (1)

Здравствуйте, Donz, Вы писали:

D>Эти ограничения накладывает Hibernate Criteria API. Я сначала составляю Criteria, который является обвязкой запроса, потом отдаю его, и запросивший этот Criteria может добавить еще условия по своему выбору.
D>В общем, можно как-либо сделать один селект через джойны заместо нескольких селектов с union?

А если создать вьюху с union-ами и использовать ее?

Что быстрее join или union. Смотреть фото Что быстрее join или union. Смотреть картинку Что быстрее join или union. Картинка про Что быстрее join или union. Фото Что быстрее join или unionОт: Donzhttp://donz-ru.livejournal.com
Дата:01.08.09 09:43
Оценка:

Здравствуйте, Romanzek, Вы писали:

D>>Есть таблица A. Надо выбрать из нее все записи, на которые есть ссылки в таблицах B и C.
D>>То есть, простейшее решение выглядит так:
D>>select A.* from A inner join B on B.a = A.a
D>>union
D>>select A.* from A inner join C on C.a = A.a

R>B и C? Или B ИЛИ C?

Или B, или C. В общем надо выбрать один раз все записи, ссылки на которые есть хотя бы в одной из таблиц B или C. Нужен аналог приведенного запроса

Что быстрее join или union. Смотреть фото Что быстрее join или union. Смотреть картинку Что быстрее join или union. Картинка про Что быстрее join или union. Фото Что быстрее join или unionОт: Donzhttp://donz-ru.livejournal.com
Дата:01.08.09 09:46
Оценка:

Здравствуйте, elmal, Вы писали:

D>>В общем, можно как-либо сделать один селект через джойны заместо нескольких селектов с union?
E>Не знаю, правильно ли, но я последний раз делал так — (сразу на HQL, специально открыл исходники, на перфоманс вроде жалоб нет)
E>

E>У меня joinов было 6, таким образом заработало гораздо шустрее, чем в случае с left join (тогда жалобы были на перфоманс Что быстрее join или union. Смотреть фото Что быстрее join или union. Смотреть картинку Что быстрее join или union. Картинка про Что быстрее join или union. Фото Что быстрее join или union).

Запрос с двумя внутренними селектами и условиями in работает быстрее left join’ов? Что-то слабо верится.
Но в любом случае подселекты не катят — мне надо все сделать через Criteria API.

Что быстрее join или union. Смотреть фото Что быстрее join или union. Смотреть картинку Что быстрее join или union. Картинка про Что быстрее join или union. Фото Что быстрее join или unionОт: Donzhttp://donz-ru.livejournal.com
Дата:01.08.09 09:49
Оценка:

Здравствуйте, elmal, Вы писали:

L>>
E>По крайней мере на MS SQL 2005 тормоза наблюдал страшные (20 секунд запрос выполнялся), сойдет только на небольших объемах. Сервер похоже сначала таблицы соединит (а они черти какого объема), а только потом фильтрует — жуть.

Можно подробнее? Оптимизацию запросов в БД начал изучать заново с полгода назад. Пока я в этом запросе ничего криминального не вижу.

Что быстрее join или union. Смотреть фото Что быстрее join или union. Смотреть картинку Что быстрее join или union. Картинка про Что быстрее join или union. Фото Что быстрее join или unionОт: Donzhttp://donz-ru.livejournal.com
Дата:01.08.09 09:53
Оценка:

Здравствуйте, Lloyd, Вы писали:

D>>Эти ограничения накладывает Hibernate Criteria API. Я сначала составляю Criteria, который является обвязкой запроса, потом отдаю его, и запросивший этот Criteria может добавить еще условия по своему выбору.
D>>В общем, можно как-либо сделать один селект через джойны заместо нескольких селектов с union?

L>А если создать вьюху с union-ами и использовать ее?

Не подходит, так как выбранные объекты могут быть изменены. С вьхой придется делать еще один мэппинг уже конкретно на таблицу и перед изменениями таскать выбранные объекты еще одним запросом с условием in. В общем, не очень красиво и захламляет код.
Плюс это повлечет изменение БД, что в моем случае несколько геморройно.

Что быстрее join или union. Смотреть фото Что быстрее join или union. Смотреть картинку Что быстрее join или union. Картинка про Что быстрее join или union. Фото Что быстрее join или unionОт: Donzhttp://donz-ru.livejournal.com
Дата:01.08.09 09:55
Оценка:

Здравствуйте, svanir, Вы писали:

D>>Есть таблица A. Надо выбрать из нее все записи, на которые есть ссылки в таблицах B и C.
D>>То есть, простейшее решение выглядит так:
D>>select A.* from A inner join B on B.a = A.a
D>>union
D>>select A.* from A inner join C on C.a = A.a

S>А почему нельзя так:
S>select A.* from A inner join B on B.a = A.a
S> inner join C on C.a=A.a
S>?

Этот запрос выберет записи, которые одновременно находятся и в B, и в C. Мне же надо условие «или в B, или в C». elmal уже написал, в общем.

S>и почему Вы берете «все» только из А?
Не совсем понял вопрос. Надо мне так, взять только все данные из таблицы A, а остальные таблицы нужны только для ограничения выборки.

Что быстрее join или union. Смотреть фото Что быстрее join или union. Смотреть картинку Что быстрее join или union. Картинка про Что быстрее join или union. Фото Что быстрее join или unionОт: elmal
Дата:01.08.09 11:28
Оценка:
Что быстрее join или union. Смотреть фото Что быстрее join или union. Смотреть картинку Что быстрее join или union. Картинка про Что быстрее join или union. Фото Что быстрее join или unionОт: elmal
Дата:01.08.09 11:41
Оценка: 8 (1)
Что быстрее join или union. Смотреть фото Что быстрее join или union. Смотреть картинку Что быстрее join или union. Картинка про Что быстрее join или union. Фото Что быстрее join или unionОт: elmal
Дата:01.08.09 11:49
Оценка:
Что быстрее join или union. Смотреть фото Что быстрее join или union. Смотреть картинку Что быстрее join или union. Картинка про Что быстрее join или union. Фото Что быстрее join или unionОт: Donzhttp://donz-ru.livejournal.com
Дата:01.08.09 17:27
Оценка:

Здравствуйте, elmal, Вы писали:

D>>Запрос с двумя внутренними селектами и условиями in работает быстрее left join’ов? Что-то слабо верится.
E>У меня тогда этих left join было штук 6, и каждый еще соединялся еще с несколькоми таблицами (ох хотелось тогда высказать все, что я думаю о структуре базы, еле сдержался Что быстрее join или union. Смотреть фото Что быстрее join или union. Смотреть картинку Что быстрее join или union. Картинка про Что быстрее join или union. Фото Что быстрее join или union). С in заработало быстрее, причем раз в 100 — скорость замерял.
D>>Но в любом случае подселекты не катят — мне надо все сделать через Criteria API.
E>Нижний вариант пробовал? Он явно должен быть самым шустрым, так как там только join по первичному ключу идет (я правда не знаю, можно ли через Criteria API пересечения таблиц как я указал делать). Возможно я ошибся, и я что-то забыл в запросе, надо пробовать, но один раз у меня точно похожим образом union на хибернейте сделать получилось.

Нижний — это left join и проверка на null? Пока нет, пробовать буду в понедельник.
За информацию спасибо, буду проверять, так как запрос будет очень часто исполняемым.

Что быстрее join или union. Смотреть фото Что быстрее join или union. Смотреть картинку Что быстрее join или union. Картинка про Что быстрее join или union. Фото Что быстрее join или unionОт: elmal
Дата:01.08.09 18:30
Оценка:

Вот только не факт, что я его правильно написал, но один раз я точно что-то подобное проворачивал на хибернейте, помню точно, что я делал union и без left join, и без in, и основная идея была именно такая — пересечение таблицы с собой под разными алиасами (задача была другой помнится). Просьба попробовать, и сообщить, если получится — я тогда в следующий раз, когда это понадобится, поиском найду, а то опять забуду Что быстрее join или union. Смотреть фото Что быстрее join или union. Смотреть картинку Что быстрее join или union. Картинка про Что быстрее join или union. Фото Что быстрее join или union. На деле, синтаксис SQL весьма избыточен, и при желании одним запросом можно сделать многое, даже если куча фичь, вроде union, вложенных подзапросов и т.д не поддерживается.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *