Оператор join: JOIN (SQL) — что это за оператор, примеры использования

Оператор JOIN для чайников

C# 4.0 Описание новых функций |
Полезные скрипты (T-SQL), полное удаление данных из таблиц БД

Данная статья будет полезна новичкам и поможет в освоении оператора JOIN и  в этом примере он будет рассмотрен в контексте языка T-SQL. Для визуализации работы запросов были также использованы диаграммы Венна, которые, как я надеюсь помогут вникнуть в смысл JOIN-ов. Для начала работы над примерами — предположим, что у нас есть 2 таблицы (‘Таблица_1’ слева и ‘Таблица_2’ справа), давайте заполним их тестовыми данными:

 

Таблица_1Таблица_2
idnameidname
—-—-
1Машина1Паром
2Грузовик2Машина
3Самолет3Велосипед
4Поезд4Самолет

 

Теперь, когда мы разобрались с условностями — можно переходить к рассмотрению примеров:

1. INNER JOIN выводит только те записи, которые совпадают в обеих таблицах

SELECT * FROM Table_1
INNER JOIN Table_2
ON Table_1.name = Table_2.name

Результат работы запроса:

 

id nameidname
 —-—-
1 Машина2Машина
3 Самолет4Самолет

 

 

 2. FULL OUTER JOIN выводит набор записей, которые совпадают в обеих таблицах (с двух сторон), там, где нет совпадения вставляется значение NULL (сравнение записей ведется с Таблицей_1, т.е. той, что с левой стороны).

SELECT * FROM Table_1
FULL OUTER JOIN Table_2
ON Table_1.name = Table_2.name

Результат работы запроса:

 

id nameidname
 —-—-
1 Машина2Машина
2 ГрузовикNULLNULL
3 Самолет4Самолет
4 ПоездNULLNULL
NULL NULL1Паром
NULL NULL3Велосипед
 

 3. LEFT OUTER JOIN выводит полный набор записей из первой таблицы (в нашем случае Таблица_1), и совпадающие записи (где это возможно) со второй таблицы (Таблица_2). Если совпадений нет — в поле вставляется значение NULL.

SELECT * FROM Table_1
LEFT OUTER JOIN Table_2
ON Table_1.name = Table_2.name
id nameidname
 —-—-
1 Машина2Машина
2 ГрузовикNULLNULL
3 Самолет4Самолет
4 ПоездNULLNULL
 

 4. RIGHT OUTER JOIN выводит полный набор записей из второй таблицы (в нашем случае Таблица_1), и совпадающие записи (где это возможно) из первой таблицы (Таблица_1). Если совпадений нет — в поле вставляется значение NULL. Как мы видим этот оператор похож на предыдущий, только в данном случае «ведущей» будет вторая таблица (с правой стороны).

SELECT * FROM Table_1
RIGHT OUTER JOIN Table_2
ON Table_1.name = Table_2.name
id nameidname
 —-—-
NULL NULL1Паром
1 Машина2Машина
NULL NULL3Велосипед
3 Самолет4Самолет
 

 5. Извлечение уникальных записей из таблицы посредством оператора WHERE. В данном примере мы выведем только те записи из Таблицы_1, которых нет в Таблице_2.

SELECT * FROM Table_1
LEFT OUTER JOIN Table_2
ON Table_1.name = Table_2.name
WHERE Table_2.id IS null
id nameidname
 —-—-
2 ГрузовикNULLNULL
4 ПоездNULLNULL
 

 6. Извлечение уникальных записей из обеих таблиц посредством оператора WHERE. В данном примере мы выведем уникальные записи из Таблицы_1 и Таблицы_2.

SELECT * FROM Table_1
FULL OUTER JOIN Table_2
ON Table_1.name = Table_2.name
WHERE Table_1.id IS null 
OR Table_2.id IS null
id nameidname
 —-—-
2 ГрузовикNULLNULL
4 ПоездNULLNULL
NULL NULL1Паром
NULL NULL3Велосипед
 

 7. CROSS JOIN. Для полноты изложения материала следует упомянуть еще об одном операторе — CROSS JOIN. Этот оператор используется довольно редко и для визуального представления нет подходящей диаграммы Венна. С помощью CROSS JOIN-а мы можем сделать перекрестную выборку всех записей из обеих таблиц (Таблицы_1 и Таблицы_2) и в нашем случае мы получим 4х4=16 строк данных. Возьмите на заметку, что лучше не применять этот опреатор для больших таблиц, т.к. это может серьезно повлиять на производительность СУБД.

SELECT * FROM Table_1
CROSS JOIN Table_2
  

Курс SQL & Hibernate — Лекция: Оператор JOIN

Предпосылки появления оператора JOIN

С ростом количества данных в таблицах в них часто возникают дубликаты значений. Например, в таблице product есть имена брендов. Которые иногда повторяются.
Было бы полезно завести для них отдельную таблицу brand, в которой были бы, например такие данные:

  • id – id-бренда;
  • name – название бренда;
  • company_owner – имя компании владельца бренда;
  • company_contacts – контакты компании владельца бренда.

Затем мы бы захотели создать таблицу адресов, в которую можно было бы вынести все адреса:

  • id – id-адреса;
  • country;
  • region;
  • city;
  • street;
  • house;
  • zip.

Более того, в этой таблице можно было бы хранить адреса не только компаний-владельцев-брендов, но и адреса клиентов и адреса сотрудников. И такой подход – это просто следствие роста количества данных (количества строк в таблицах). Так легче оперировать данными в таблицах и поддерживать их целостность.

Когда у тебя 5 сотрудников, ты можешь просто указать их профессию в колонке occupation. Если у тебя в компании 5 тысяч сотрудников, то нужна таблица со списком х профессий, их обязанностями.

В языке Java, кстати, есть что-то похожее. Если у тебя в методе много кода, то возникает желание разбить его на несколько методов. Если в классе много методов, то хочется разбить его на несколько классов.

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

А ведь только фильтрация миллиарда строк с помощью WHERE может занять часы. Поэтому создатели языка SQL предложили свое решение – оператор JOIN.

Знакомство с оператором JOIN

Оператор JOIN используется для того, чтобы явно сказать SQL-серверу, что нам нужно не декартово произведение всех строк таблиц на всех, а умное склеивание строк разных таблиц, которые ссылаются друг на друга с помощью ID (или другим способом).
Сервер имеет отдельный алгоритм обработки объединения таблиц с помощью оператора JOIN, что позволяет выполнять такие операции значительно быстрее. Общий вид оператора JOIN такой:

таблица1 JOIN таблица2 ON условие 

Тут написано, что нужно объединить в одну таблицу таблицы таблица1 и таблица2, а в качестве критерия объединения использовать условие.

Давай возьмем наш старый пример:

SELECT * FROM employee, task WHERE emploee.id = task.emploee_id 

И перепишем его с применением оператора JOIN:

SELECT * FROM employee JOIN task ON emploee.id = task.emploee_id 

Оба запроса дадут один и тот же результат в нашем случае, но это только потому, что запросы очень простые. В дальнейшем WHERE позволяет наращивать именно фильтр строк, а указанное после ON – писать сложные сценарии связывания таблиц.
Вы так же можете использовать алиасы (псевдонимы таблиц) при использовании оператора JOIN. Пример:

SELECT * FROM employee e JOIN task t ON e.id = t.emploee_id

Использование оператора соединения

Содержимое

Вступление
Характеристики:
Вкладка «Общие»
Свойства: Параметры присоединения
Вкладка
Свойства: на основе ценности
Вкладка «Настройки»
Свойства: на основе кортежей
Вкладка «Настройки»
Свойства: настройки вывода
Вкладка
Свойства: вкладка «Параллелизм»
Пример
1: Соединение на основе ценности
Пример
2: Соединение на основе кортежей
Похожие темы

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

Вступление

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

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

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

Примечание

На нескольких вкладках оператора соединения, описанных в этом разделе, используются выражения
которые ссылаются на поля во входных потоках. Когда важно указать, какой
входной поток, в котором находится поле, вы можете уточнять имена полей, используя
условности input1. имя поля и
вход2. имя-поля . ввод1. Префикс относится к данным, поступающим на «верхний» порт (#1),
в то время как input2. Префикс относится к данным, поступающим на
«нижний» порт (#2). Примеры: input1.SKU и
ввод2.SKU .

Характеристики:
Вкладка «Общие»

Имя: используйте это поле, чтобы указать или изменить
имя компонента, которое должно быть уникальным в приложении. Имя должно содержать только
алфавитные символы, цифры и символы подчеркивания, а не дефисы или другие специальные символы.
символы. Первый символ должен быть буквенным или символом подчеркивания.

Включить порт вывода ошибок: установите этот флажок, чтобы добавить
Порт ошибки к этому компоненту. На холсте EventFlow порт ошибок отображается как
красный выходной порт, всегда последний порт для компонента. См. Использование портов ошибок и потоков ошибок для
узнать о портах ошибок.

Описание: При желании введите текст для краткого описания
назначение и функции компонента. На холсте EventFlow вы можете увидеть
описание, нажав Ctrl пока
отображается всплывающая подсказка компонента.

Свойства: вкладка «Параметры присоединения»

На вкладке «Настройки присоединения» укажите, как будет выполняться сопряжение входных данных (путем
значения или кортежи), когда удалять любые кортежи, время ожидания которых истекло, и предикат
(тестовое условие), при котором должно произойти соединение.

Присоединиться через
  • Соединения на основе значений полезны, когда важно иметь StreamBase.
    вернуть полный ответ, а не приблизительный ответ. Присоединение
    values ​​означает, что значения кортежей в одном входном потоке будут
    по сравнению со значениями кортежей в другом входном потоке.

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

Тайм-аут кортежа

Прошедшее время, по истечении которого кортежи должны быть удалены из буфера соединения.

Предикат

Укажите выражение, которое будет оцениваться как правда
или ложь . Когда true, условие соединения
удовлетворяется, и оператор Join выдает выходные данные, указанные в
Вкладка «Параметры вывода».

Примечание

Ваш выбор Присоединиться к вариантам вызывает следующее
вкладку в представлении «Свойства объединения» с названием «Настройки на основе значений» или «На основе кортежей».
Настройки.

Свойства: вкладка «Параметры на основе значений»

Вкладка «Параметры на основе значений» доступна только в том случае, если на вкладке «Параметры объединения» выбран параметр «Объединить по значениям». Используйте эту вкладку для выбора
поля, которые вы хотите заказать, и диапазон значений, за пределами которого эти два поля не могут
отличаются:

  • В полях заказа укажите поля, в которых
    данные от каждого из двух входных портов будут упорядочены.

  • В диапазоне соединения укажите диапазон значений, которые могут содержать поля упорядочивания:

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

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

В следующем примере диапазон соединения равен 120: значение Time_C может быть на 60 меньше.
чем значение в Time_R, и на 60 больше:

Примечание

Поскольку оператор Join чувствителен к порядку, результаты непредсказуемы, если кортежи
приходят не по порядку относительно полей заказа.

Свойства: вкладка «Настройки на основе кортежей»

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

Используйте эту вкладку, чтобы указать размеры окна для первого и второго портов. Окно
size указывает, сколько кортежей одного входного порта сравнивается с каждым поступающим
кортеж на другом входном порту. Как правило, чем больше размер окна, тем
ближе приблизительный результат запроса будет к «полному ответу».

Примечание

Только соединения на основе кортежей имеют размеры окна, и эти окна увеличиваются на 1.

Свойства: вкладка «Параметры вывода»

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

Укажите поля вывода, используя один из двух параметров вывода:

  • Выберите все поля ввода, чтобы автоматически
    передать все входные поля в выходной поток.

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

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

  • Выберите явно заданные поля, чтобы указать
    поля вывода вручную.

    Если выбрана явная опция, выходные данные
    Таблица полей изначально пуста. Добавьте строку для каждого поля вывода, которое вы
    хотите, указав имя выходного поля и его
    Выражение. В качестве альтернативы используйте Pass All
    Кнопка для загрузки любого или всех полей ввода в таблицу.

    На следующем экране показана таблица полей вывода.
    который был отредактирован вручную с использованием явной опции.

Свойства: вкладка «Параллелизм»

Используйте вкладку Concurrency, чтобы указать параллельные регионы для этого экземпляра этого
компонент, или параметры множественности, или и то, и другое. Настройки вкладки «Параллелизм»
описано в параллелизме
Параметры и стили отправки описаны в разделе Стили отправки.

Осторожность

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

Пример 1:
Соединение на основе значения

В этом примере отслеживается выполнение установленного образца приложения Join.
со СтримБейс. Приложение объединяет сделки из двух каналов, ReutersIn и
КомстокИн. Схема входного потока содержит следующие поля: символ акции,
его цена и временная метка.

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

Symbol_R == Symbol_C && abs(PricePS_R - PricePS_C) >= 1.0
 

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

На каждом шаге этого примера показано, как новый кортеж помещается в очередь оператора Join, и
любые выпущенные выходные кортежи. Содержимое двух буферов операторов
отображается после поступления каждого кортежа и после освобождения любых кортежей.

  1. Кортеж входит в оператор Join на входном порту ReutersIn (здесь сокращено до
    R) и хранится в буфере:

  2. Кортеж входит в порт ComstockIn (сокращенно C). Значение его первого
    поле (B) соответствует символу в первом кортеже, но разница в цене (в
    второе поле) меньше единицы. Таким образом, присоединение ничего не освобождает.
    оператор:

  3. Кортеж на порту R совпадает с другим портом и имеет разницу в цене.
    равно 1. Условия для операции соединения выполнены, и оператор соединения
    выдает выходной кортеж:

  4. В очередь ставится кортеж, содержащий новый символ акции (A). Потому что это не
    соответствуют любым существующим кортежам, вывод не производится:

  5. Кортеж поступает на порт C, символ которого совпадает с двумя кортежами из другого порта.
    порт. В обоих случаях разница в цене больше 1. В результате два
    выпускаются кортежи — по одному на каждое совпадение:

  6. Новый кортеж соответствует символу одного существующего кортежа на другом входном порту,
    с разницей в цене 2. Следовательно, оператор Join выдает еще один кортеж:

  7. Последний кортеж, помещенный в очередь на входном порту C, соответствует двум кортежам на порте R.
    Однако новый кортеж вызывает диапазон значений времени в соответствующих кортежах
    превышать указанный диапазон соединения в 60 секунд. Новый кортеж продвигает
    верхней границы диапазона до 100, а другие совпадающие кортежи теперь ниже
    присоединиться к диапазону. В результате совпадающие кортежи на другом порту удаляются из
    буфер, и вывод не производится:

Пример 2:
Соединение на основе кортежей

В этом примере отслеживается выполнение операции соединения на основе кортежа. Приложение
достаточно просто, чтобы ясно проиллюстрировать основную идею объединения на основе кортежей. Каждый вход
port содержит всего два поля: символ акции и цену. Пары операторов Join
кортежи, которые совпадают в обоих полях. Размеры окна установлены на 3 для первого ввода.
порт и 2 для второго входного порта. Когда происходит соединение, выходной кортеж включает
совпадающий символ и значения цены.

На каждом шаге этого примера показано, как новый кортеж ставится в очередь оператору соединения.
содержимое двух окон отображается после поступления каждого кортежа и после любых кортежей
выпущены. Можно сказать, что окна «двигаются» по потоку данных: обратите внимание, что
когда количество прибывающих кортежей превышает выделенный размер окна, самый старый
кортежи удаляются из окна.

  1. Для начала четыре кортежа ставятся в очередь. Кортежи, входящие в первый входной порт,
    буферизуются в первом окне оператора Join, а вводимые во втором
    port хранятся во втором окне. Вывод пока не происходит, потому что ни один из
    кортежи, входящие в первый порт, соответствуют любым кортежам из второго порта:

  2. Далее кортеж поступает во второй входной порт и соответствует кортежу в первом
    буфер. Поэтому происходит соединение, и оператор выпускает соответствующий кортеж. В
    Кроме того, обратите внимание, что когда окно заполнено и поступает новый кортеж,
    окно перемещается по потоку кортежей: самый старый кортеж в окне (B,
    60), смывается из окна.

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

  4. Наконец, другой кортеж, входящий в первый входной порт, вызывает его окно.
    продвигаться вперед и сбрасывать самый старый кортеж. Между тем, новый кортеж соответствует еще одному.
    хранится во втором окне, поэтому оператор Join освобождает кортеж.

Похожие темы

  • Образец оператора присоединения

  • Выражение StreamBase
    Языковые функции

    9

    Операция присоединения к СУБД — javatpoint

    следующий →
    ← предыдущая

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

    Пример:

    СЛУЖАЩИЙ

    EMP_CODE EMP_ИМЯ
    101 Стефан
    102 Джек
    103 Гарри

    ЗАРПЛАТА

    EMP_CODE ЗАРПЛАТА
    101 50000
    102 30000
    103 25000

    Операция: (СОТРУДНИК ⋈ ЗАРПЛАТА)

    Результат:

    EMP_CODE EMP_ИМЯ ЗАРПЛАТА
    101 Стефан 50000
    102 Джек 30000
    103 Гарри 25000

    1. Естественное соединение:

    • Естественное соединение — это набор кортежей всех комбинаций в R и S, которые совпадают по их общим именам атрибутов.
    • Обозначается ⋈.

    Пример: Давайте использовать приведенную выше таблицу EMPLOYEE и таблицу SALARY:

    Ввод:

    ∏EMP_NAME, ЗАРПЛАТА (СОТРУДНИК ⋈ ЗАРПЛАТА)

    Вывод:

    EMP_ИМЯ ЗАРПЛАТА
    Стефан 50000
    Домкрат 30000
    Гарри 25000

    2. Внешнее соединение:

    Операция внешнего соединения является расширением операции соединения. Он используется для работы с недостающей информацией.

    Пример:

    СЛУЖАЩИЙ

    EMP_ИМЯ УЛИЦА ГОРОД
    Баран Гражданская линия Мумбаи
    Шьям Парковая улица Калькутта
    Рави М.Г. Улица Дели
    Хари Неру Нагар Хайдарабад

    FACT_WORKERS

    EMP_ИМЯ ФИЛИАЛ ЗАРПЛАТА
    Баран Инфосис 10000
    Шьям Випро 20000
    Кубер ХКЛ 30000
    Хари ТКС 50000

    Ввод:

    (СОТРУДНИК ⋈ FACT_WORKERS)

    Вывод:

    EMP_ИМЯ УЛИЦА ГОРОД ФИЛИАЛ ЗАРПЛАТА
    Баран Гражданская линия Мумбаи Инфосис 10000
    Шьям Парковая улица Калькутта Випро 20000
    Хари Неру Нагар Хайдарабад ТКС 50000

    Внешнее соединение бывает трех типов:

    1. Левое внешнее соединение
    2. Правое наружное соединение
    3. Полное наружное соединение

    а.

    Левое внешнее соединение:

    • Левое внешнее соединение содержит набор кортежей всех комбинаций в R и S, которые совпадают по их общим именам атрибутов.
    • В левом внешнем объединении кортежи в R не имеют совпадающих кортежей в S.
    • Обозначается ⟕.

    Пример: Используя приведенную выше таблицу EMPLOYEE и таблицу FACT_WORKERS

    Ввод:

    СОТРУДНИК ⟕ FACT_WORKERS

    EMP_ИМЯ УЛИЦА ГОРОД ФИЛИАЛ ЗАРПЛАТА
    Баран Гражданская линия Мумбаи Инфосис 10000
    Шьям Парковая улица Калькутта Випро 20000
    Хари улица Неру Хайдарабад ТКС 50000
    Рави М.Г. Улица Дели НУЛЕВОЙ НУЛЕВОЙ

    б.

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

    • Правое внешнее соединение содержит набор кортежей всех комбинаций в R и S, которые совпадают по их общим именам атрибутов.
    • В правом внешнем объединении кортежи в S не имеют совпадающих кортежей в R.
    • Обозначается ⟖.

    Пример: Используя приведенную выше таблицу EMPLOYEE и отношение FACT_WORKERS

    Ввод:

    СОТРУДНИК ⟖ FACT_WORKERS

    Вывод:

    EMP_ИМЯ ФИЛИАЛ ЗАРПЛАТА УЛИЦА ГОРОД
    Баран Инфосис 10000 Гражданская линия Мумбаи
    Шьям Випро 20000 Парковая улица Калькутта
    Хари ТКС 50000 улица Неру Хайдарабад
    Кубер ХКЛ 30000 НУЛЕВОЙ НУЛЕВОЙ

    в.

    Полное внешнее соединение:

    • Полное внешнее соединение похоже на левое или правое соединение, за исключением того, что оно содержит все строки из обеих таблиц.
    • В полном внешнем соединении кортежи в R, у которых нет совпадающих кортежей в S, и кортежи в S, у которых нет совпадающих кортежей в R в их общем имени атрибута.
    • Обозначается ⟗.

    Пример: Используя приведенную выше таблицу EMPLOYEE и таблицу FACT_WORKERS

    Ввод:

    СОТРУДНИКИ ⟗ FACT_WORKERS

    Вывод:

    EMP_ИМЯ УЛИЦА ГОРОД ФИЛИАЛ ЗАРПЛАТА
    Баран Гражданская линия Мумбаи Инфосис 10000
    Шьям Парковая улица Калькутта Випро 20000
    Хари улица Неру Хайдарабад ТКС 50000
    Рави М.

    Imacros | Все права защищены © 2021