Sql select join: SQL INNER JOIN Keyword

Объединение таблиц SQL: Расширенное руководство

Поиск

Все запросы до этого момента были полезны, за исключением одного серьезного ограничения — вы могли выбирать только из одной таблицы за раз с помощью инструкции SELECT. Пришло время познакомить вас с одной из самых полезных функций систем SQL и реляционных баз данных — « Присоединиться к ». Проще говоря, «Join» делает системы реляционных баз данных «реляционными».

Соединения позволяют связать данные из двух или более таблиц в один результат запроса — из одного оператора SELECT.

Оператор «Join» может быть распознан в операторе SQL SELECT, если он содержит более одной таблицы после ключевого слова FROM.

Например:

 ВЫБЕРИТЕ "список столбцов"

ОТ  таблица1  ,  таблица2 

ГДЕ "условия(я) поиска" 

Соединения легче объяснить, показав, что произойдет, если вы будете работать только с одной таблицей и не сможете использовать «соединения». Эту базу данных с одной таблицей также иногда называют «плоской таблицей». Допустим, у вас есть база данных с одной таблицей, которая используется для отслеживания всех ваших клиентов и того, что они покупают в вашем магазине:

id первый последний адрес город состояние почтовый индекс дата товар цена

Каждый раз, когда в таблицу вставляется новая строка, все столбцы будут обновляться, что приводит к появлению ненужных «избыточных данных». Например, каждый раз, когда Вольфганг Шульц что-то покупает, в таблицу будут вставляться следующие строки:

id первый последний адрес город состояние почтовый индекс дата товар цена
10982 Вольфганг Шульц 300 Н. 1-й пр. Юма АЗ 85002 032299 сноуборд 45,00
10982 Вольфганг Шульц 300 Н. 1-й пр. Юма АЗ 85002 082899 лопата для снега 35.00
10982 Вольфганг Шульц 300 Н. 1-й пр. Юма АЗ 85002 091199 перчатки 15.00
10982 Вольфганг Шульц 300 Н. 1-й пр. Юма АЗ 85002 100999 фонарь 35,00
10982 Вольфганг Шульц 300 Н. 1-й пр. Юма АЗ 85002 022900 палатка 85,00

В идеальной базе данных должно быть две таблицы:

  1. Одна для отслеживания ваших клиентов
  2. И другой, чтобы следить за тем, что они покупают:

Таблица «Customer_info»:

номер_клиента имя фамилия адрес город состояние почтовый индекс

Таблица «Покупки»:

номер_клиента дата товар цена

Теперь всякий раз, когда покупка совершается у постоянного клиента, необходимо только обновить 2-ю таблицу «Покупки»! Мы только что убрали бесполезные избыточные данные, то есть мы только нормализовали эту базу данных!

Обратите внимание, что каждая из таблиц имеет общий столбец «customer_number». Этот столбец, который содержит уникальный номер клиента, будет использоваться для ОБЪЕДИНЕНИЯ двух таблиц. Допустим, используя две новые таблицы, вы хотите выбрать имя клиента и товары, которые он приобрел. Вот пример оператора соединения для этого:

 SELECT customer_info.firstname, customer_info.lastname, Purchases.item

ОТ customer_info, покупки

ГДЕ customer_info.customer_number = Purchases.customer_number; 

Это конкретное «соединение» известно как «внутреннее соединение» или «сопоставление». Это наиболее распространенный тип «Присоединиться», который вы увидите или используете.

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

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

Хотя приведенное выше, вероятно, будет работать, вот спецификация синтаксиса ANSI SQL-92 для внутреннего соединения с использованием предыдущего оператора, который вы можете попробовать:

 SELECT customer_info.firstname, customer_info.lastname, Purchases.item

ОТ customer_info ВНУТРЕННИЕ ПРИСОЕДИНЯЙТЕСЬ к покупкам

ON customer_info.customer_number = Purchases.customer_number; 

 

Другой пример:

 ВЫБЕРИТЕ employee_info.employeeid, employee_info.lastname, employee_sales.comission

ОТ employee_info, employee_sales

ГДЕ employee_info.employeeid = employee_sales.employeeid; 

Этот оператор выберет идентификатор сотрудника, фамилию (из таблицы employee_info) и значение комиссии (из таблицы employee_sales) для всех строк, в которых идентификатор сотрудника в таблице employee_info совпадает с идентификатором сотрудника в таблице employee_sales.

 

Используйте эти таблицы для упражнений
шт. под заказ
клиенты

Обзорные упражнения

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

    Показать ответ

  2. Повторите упражнение №1, но отсортируйте результаты по штатам в порядке убывания.

    Показать ответ

Введите выражение SQL здесь:

 Здесь будут показаны результаты 

SELECT — JOIN — Документация по ключевым словам ABAP

SAP NetWeaver AS ABAP, выпуск 751, © Copyright 2017 SAP AG. Все права защищены.

ABAP — Документация по ключевым словам →
ABAP – Справочник →
Обработка внешних данных →
Доступ к базе данных ABAP →
Открыть SQL →
Открыть SQL — Чтение →
предложения SELECT →
ВЫБЕРИТЕ — ИЗ →

ВЫБЕРИТЕ — ПРИСОЕДИНЯЙТЕСЬ

Краткий справочник

Синтаксис

. .. [ ( ] {
data_source [ Таблицы AS ] } | присоединиться к
{ [ ВНУТРЕННЯЯ ] ПРИСОЕДИНЯЙТЕСЬ } | { ЛЕВЫЙ | ПРАВЫЙ [ ВНЕШНИЙ ] СОЕДИНЕНИЕ } | { ПОПЕРЕЧНОЕ СОЕДИНЕНИЕ }
{
data_source [ Таблицы AS ] } | присоединение [ ON join_cond ] [ ) ] …  .

Добавление:

… ON join_cond

Эффект

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

  • [ ВНУТРЕННЯЯ ] СОЕДИНЕНИЕ (внутреннее соединение)
  • ЛЕВЫЙ | ПРАВЫЙ [ ВНЕШНИЙ ] СОЕДИНЕНИЕ (внешнее соединение)
  • ПЕРЕКРЕСТНОЕ СОЕДИНЕНИЕ (перекрёстное соединение)

Каждое выражение соединения для внутреннего или внешнего соединения должно содержать условие соединения
после включения (см. ниже). Выражение соединения для перекрестного соединения не может содержать никаких условий соединения.

Следующее относится к записям, указанным слева и справа:

  • data_source — это единственный источник данных. Таблицы базы данных должны быть
    прозрачный. Как когда
    указывается как один источник после FROM
    с помощью AS можно указать альтернативное имя таблицы для источника данных. Источник данных может существовать более одного раза в выражении соединения и может иметь различные альтернативные имена.
    Объединенные и
    кластерные таблицы не могут быть объединены с помощью выражений соединения.
  • Выражение соединения может быть указано для соединения с обеих сторон. Выражение соединения
    поэтому могут быть вложены рекурсивно. Количество источников данных, связанных друг с другом, ограничено.
    максимальное число определено таким образом, чтобы оператор SELECT мог быть выполнен на
    все поддерживаемые системы баз данных и в настоящее время установлено на 50 . Если известны статически, более 49соединения вызывают синтаксическую ошибку. Если нет, они выдают ошибку времени выполнения.

Приоритет, с которым оцениваются выражения вложенного соединения, указывается следующим образом:

  • Для внутренних и внешних соединений приоритет определяется положением ON
    условия. Слева направо каждое состояние ВКЛ назначается непосредственно
    перед JOIN и создает выражение соединения. Выражения соединения этого типа могут быть заключены в круглые скобки (
    ). Это необязательно. Явно указанные скобки должны совпадать со скобками, неявно указанными в условиях ON.
  • По умолчанию перекрестные соединения оцениваются слева направо. На приоритет оценки можно повлиять с помощью круглых скобок ( ).
  • При объединении нескольких перекрестных соединений порядок оценки не имеет значения. Результат всегда один и тот же, а количество строк является произведением количества строк всех задействованных источников данных.
  • Если перекрестные соединения сочетаются с внутренними и внешними соединениями, результат может зависеть от порядка вычисления или круглых скобок.

Набор результатов для внутренних соединений

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

Набор результатов для внешних соединений

Внешнее соединение создает тот же набор результатов, что и внутреннее соединение. Отличие состоит в том, что для каждого выбранного
строку с левой стороны как LEFT OUTER JOIN или с правой стороны как RIGHT
ВНЕШНЕЕ СОЕДИНЕНИЕ, в результирующем наборе создается хотя бы одна строка, даже если на другой стороне нет строк
выполнить условие join_cond. Столбцы на другой стороне, которые не соответствуют условию join_cond, заполняются
нулевые значения.

Набор результатов для перекрестного соединения

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

Примечания

  • Некоторые ограничения применяются к другим предложениям в текущем операторе SELECT.
    когда используются выражения соединения. Например, выражение соединения нельзя использовать вместе с добавлением
    ПОРЯДОК ПО ПЕРВИЧНОМУ КЛЮЧУ. Эти ограничения задокументированы в соответствующих пунктах.
  • Условие WHERE для оператора SELECT с соединениями применяется к набору результатов, созданному с помощью соединений.
  • Внутреннее соединение или перекрестное соединение между двумя отдельными источниками данных является коммутативным. Если поменять местами левую и правую сторону, результат останется прежним.
  • Перекрестное соединение ведет себя как внутреннее или внешнее соединение, условие ON которого всегда равно
    истинный. Перекрестное соединение с условием WHERE дает тот же результат, что и внутреннее
    соединение с идентичным условием включения. В отличие от внутреннего соединения, в перекрестном соединении
    все данные сначала считываются перед оценкой условия. При внутреннем объединении считываются только данные, соответствующие условию ON.
  • Перекрёстное соединение следует использовать с особой осторожностью. Так как нет возможности указать
    В состоянии ON считываются все данные всех задействованных источников данных. В случае очень больших наборов данных
    набор результатов (количество строк которого всегда является произведением количества всех строк обоих источников данных) может быстро стать очень большим.
  • Перекрестное соединение двух клиентских источников данных внутренне преобразуется во внутреннее соединение,
    Условие ON проверяет, равны ли клиентские столбцы левой и правой сторон. Если одна сторона не зависит от клиента, перекрестное соединение выполняется полностью.
  • Если одно и то же имя столбца появляется в нескольких источниках данных одного выражения соединения, эти источники должны быть идентифицированы во всех других добавлениях оператора SELECT с помощью
    селектор столбца ~.
  • Выражения соединения обходят SAP
    буферизация. Поэтому их не следует применять к буферизованным таблицам. Вместо этого может быть хорошей идеей
    использовать дополнение FOR ALL ENTRIES в этих случаях, которые могут получить доступ к буферу таблицы.
  • Если столбцы с правой стороны указаны как LEFT OUTER JOIN или столбцы
    слева указаны как RIGHT OUTER JOIN, после добавления
    ORDER BY, порядок сортировки (в случае нулевых значений) может зависеть от системы базы данных.
  • Функцию «coalesce» можно использовать для замены нулевых значений, созданных в результате внешнего объединения, другими значениями или результатом выражений.
  • Проверка синтаксиса выполняется в строгом режиме для версии 7.40, SP05 в следующих случаях:
  • Не все сравнения состояния ON содержат столбец из источника данных, указанного справа в качестве операнда.
  • Несколько последовательных соединений явно заключаются в скобки, чтобы выражение соединения (а не источник данных) находилось в правой части выражения соединения.
  • Используется ПРАВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ.
  • В LEFT OUTER JOIN поля справа от WHERE
    указано условие текущего оператора SELECT. В RIGHT OUTER JOIN указываются поля с левой стороны.
  • Проверка синтаксиса выполняется в строгом режиме для версии 7.40, SP08 в следующих случаях:
  • Использование дополнений LIKE, IN и NOT
    плюс операторы ИЛИ или НЕ в состоянии ON.
  • Внешнее соединение без сравнения столбцов слева и справа.
  • Проверка синтаксиса выполняется в строгом режиме для версии 7.51 в следующих случаях:
  • Использует ПЕРЕКРЕСТНОЕ СОЕДИНЕНИЕ.

Исполняемый пример

Внутренние, внешние и поперечные соединения

Добавление

… ON join_cond

Эффект

Условие присоединения. Условие соединения должно быть указано для внутреннего или внешнего соединения. Условие соединения не обязательно указывать для перекрестного соединения.

Синтаксис условий соединения join_cond такой же, как и для условий
sql_cond после добавления WHERE, но со следующими отличиями:

  • После ON должно быть указано хотя бы одно сравнение.
  • Выражения SQL нельзя использовать с правой стороны.
  • Выражение [ NOT ] IN seltab использовать нельзя.
  • Подзапросы использовать нельзя.
  • Выражения пути использовать нельзя.
  • Динамическое условие (cond_syntax)
    может быть указан только в том случае, если предложение FROM указано статически и не указано динамически как (исходный_синтаксис).
  • Сравнение между столбцами таблицы, которые не имеют того же типа данных и длины в базе данных, может
    ведут себя по-разному на разных платформах баз данных. Различия в поведении могут привести к разным
    результаты или ошибки SQL на отдельных платформах. Это связано с тем, что условие соединения оценивается полностью
    в базе данных, и предварительное преобразование типа ABAP не выполняется. Отображаемое поведение полностью зависит от правил преобразования базы данных. Однако базы данных обычно предлагают меньше вариантов преобразования, чем ABAP.

Примечания

  • Настоятельно рекомендуется использовать условия соединения только между столбцами базы данных одного типа и длины.
  • Если шаблон состоит ровно из одного символа «%» при сравнении с использованием
    LIKE, происходит та же оптимизация, что и при использовании WHERE.
    Условие col LIKE ‘%’ всегда истинно, даже если столбец col содержит нулевые значения.
  • Если выражение хоста встречается справа от условия ON, проверка синтаксиса выполняется в
    строгий режим из версии 7.50, который обрабатывает оператор более строго, чем обычная проверка синтаксиса.
  • Если
  • SQL-выражения используются слева от условия включения любого соединения или
  • выражение IS [ NOT ] NULL используется в состоянии ON внешнего соединения,
проверка синтаксиса выполняется в строгом режиме, начиная с версии 7.50, который обрабатывает оператор более строго, чем обычная проверка синтаксиса.

Пример

Объединение столбцов carrname, connid и
fldate таблиц базы данных scarr, spfli,
и sflight с использованием двух внутренних соединений. Это создает список рейсов из p_cityfr в p_cityto. Псевдоним назначается каждой таблице.

ПАРАМЕТРЫ: p_cityfr TYPE spfli-cityfrom,
            p_cityto TYPE spfli-cityto.

ТИПЫ: НАЧАЛО wa,
         fldate ТИП sflight-fldate,
имя_автомобиля ТИП_имя_автомобиля,
         connid   ТИП spfli-connid,
КОНЕЦ ва.

ДАННЫЕ itab ТИП СОРТИРОВКА ТАБЛИЦА WA
          С УНИКАЛЬНЫМ КЛЮЧОМ fldate carrname connid.

ВЫБЕРИТЕ c~carrname, p~connid, f~fldate
       FROM ( ( scarr AS c
ВНУТРЕННЕЕ СОЕДИНЕНИЕ spfli AS p ON p~carrid   = c~carrid

И p~cityfrom = @p_cityfr

И p~cityto   = @p_cityto )
ВНУТРЕННЕЕ СОЕДИНЕНИЕ sflight AS f ON f~carrid = p~carrid

И f~connid = p~connid )
В СООТВЕТСТВУЮЩИЕ ПОЛЯ ТАБЛИЦЫ @itab.

cl_demo_output=>дисплей( itab ).

Пример

Присоединяйтесь к столбцам carrid, carrname и connid
таблиц базы данных scarr и spfli с помощью
левое внешнее соединение. Для всех рейсов, которые не отправляются из p_cityfr, в столбце connid устанавливается нулевое значение, которое было преобразовано в удобный для ввода тип.
начальное значение (при передаче
к связанному объекту данных). Отображаются все авиакомпании, которые не летают из p_cityfr.

ПАРАМЕТРЫ p_cityfr ТИП spfli-cityfrom.

ТИПЫ: НАЧАЛО wa,
         carrid   ТИП scarr-carrid,
carrname TYPE scarr-carrname,
         connid   TYPE spfli-connid,
КОНЕЦ ва.
ДАННЫЕ itab ТИП СОРТИРОВКА ТАБЛИЦА WA
С НЕУНИКАЛЬНЫМ КЛЮЧОМ carrid.

ВЫБЕРИТЕ s~carrid, s~carrname, p~connid
       ИЗ Scarr AS s
LEFT OUTER JOIN spfli AS p ON s~carrid   =  p~carrid

И p~cityfrom = @p_cityfr
В СООТВЕТСТВУЮЩИЕ ПОЛЯ ТАБЛИЦЫ @itab.

УДАЛИТЬ itab WHERE connid <> ‘0000’.

cl_demo_output=>дисплей( itab ).

Пример

Перекрестное соединение таблицы T000 всех клиентов AS ABAP с записями
для класса сообщений SABAPDEMOS в таблице T100. Без условия WHERE набор результатов был бы очень большим.

НАЧАЛО ДАННЫХ wa.
ТИП ДАННЫХ мандт t000-мандт.
ДАННЫЕ mtext ТИП t000-mtext.
ВКЛЮЧАЕТ ТИП t100.