CONCATENATE — это объединение двух таблиц. В отличие от присоединения, где вторая таблица добавляется сбоку, объединение добавляет вторую таблицу снизу. При этом, как и в случае присоединения, результирующая таблица содержит полный набор полей из обеих таблиц. Объединение очень похоже на операцию SQL UNION с небольшими отличиями — префикс CONCATENATE может быть использован даже если набор полей в двух таблицах разный и полностью идентичные записи не удаляются из результата операции.
Если две таблицы содержат поля с одинаковыми именами, объединение выполняется автоматически. И такое автоматическое объединение частый источник ошибок у новичков. Эта важная деталь, о которой необходимо помнить.
Синтаксис CONCATENATE выглядит следующим образом:
Concatenate [ (tablename ) ] ( loadstatement | selectstatement )
Продемонстрируем работу префикса CONCATENATE на примере — пусть у нас есть две таблицы Продажи и Поставки и мы ходим объединить их в одну таблицу. Таблица Продажи выглядит следующим образом:
Дата | Время | Товар | Количество | Сумма |
01.01.2020 | 14:32:00 | Гвоздь | 500 | 5000 |
02.01.2020 | 10:30:00 | Шуруп | 20 | 250 |
05.01.2020 | 16:51:00 | Винт | 300 | 4500 |
07.01.2020 | 13:47:00 | Гайка | 50 | 650 |
01.01.2020 | 10:43:00 | Гвоздь | 500 | 5000 |
02.01.2020 | 11:43:00 | Винт | 300 | 4500 |
05.01.2020 | 12:43:00 | Гайка | 50 | 650 |
Таблица Поставки в свою очередь выглядит так:
Дата | Товар | Количество | Поставщик |
01.01.2020 | Гвоздь | 1000 | ООО «Железная тема» |
01.01.2020 | Шуруп | 50 | ООО «Железная тема» |
02.01.2020 | Винт | 1000 | АО «Метализделие» |
03.01.2020 | Гайка | 100 | ИП Иванов |
Скрипт загрузки данных и использования CONCATENATE выглядит следующим образом:
ДвижениеТоваров:
LOAD * INLINE [
Дата Время Товар Количество Сумма
01.01.2020 14:32:00 Гвоздь 500 5000
02.01.2020 10:30:00 Шуруп 20 250
05.01.2020 16:51:00 Винт 300 4500
07.01.2020 13:47:00 Гайка 50 650
01.01.2020 10:43:00 Гвоздь 500 5000
02.01.2020 11:43:00 Винт 300 4500
05.01.2020 12:43:00 Гайка 50 650
] (delimiter is spaces);
CONCATENATE(ДвижениеТоваров)
LOAD * INLINE [
Дата Товар Количество Поставщик
01.01.2020 Гвоздь 1000 ‘ООО «Железная тема»‘
01.01.2020 Шуруп 50 ‘ООО «Железная тема»‘
02.01.2020 Винт 1000 ‘АО «Метализделие»‘
03.01.2020 Гайка 100 ‘ИП Иванов’
] (delimiter is spaces);
В скрипте данные обеих таблиц загружаются в одну таблицу с названием ДвижениеТоваров. Порядок загрузки таблиц не важен. Результирующая таблица будет выглядеть следующим образом:
Дата | Время | Товар | Количество | Сумма | Поставщик |
02.01.2020 | 10:30:00 | Шуруп | 20 | 250 | — |
01.01.2020 | 10:43:00 | Гвоздь | 500 | 5000 | — |
02.01.2020 | 11:43:00 | Винт | 300 | 4500 | — |
05.01.2020 | 12:43:00 | Гайка | 50 | 650 | — |
07.01.2020 | 13:47:00 | Гайка | 50 | 650 | — |
01.01.2020 | 14:32:00 | Гвоздь | 500 | 5000 | — |
05.01.2020 | 16:51:00 | Винт | 300 | 4500 | — |
01.01.2020 | — | Гвоздь | 1000 | — | ООО «Железная тема» |
01.01.2020 | — | Шуруп | 50 | — | ООО «Железная тема» |
02.01.2020 | — | Винт | 1000 | — | АО «Метализделие» |
03.01.2020 | — | Гайка | 100 | — | ИП Иванов |
Обратите внимание на то, что в данных таблицы Поставки отсутствовали сведения в полях Время и Сумма поскольку таких столбцов просто не было в таблице Поставки, поэтому в результирующей таблице в строках из таблицы Поставки поля Время и Сумма заполнены пустыми значениями (NULL значениями).
Соответственно, и значения поля Поставщик для строк результирующей таблицы которые добавлены из таблицы Продажи заполнены пустыми значениями.
CONCATENATE or NOCONCATENATE
Как уже было отмечено в начале статьи, в случаях когда обе таблицы содержат полностью идентичные наименования полей, происходит автоматическое объединение результатом которого является одна таблица. Проще всего это представить на следующем примере — загрузим таблицу Продажи, а затем загрузим из нее данные в другую таблицу Продажи2:
Продажи:
LOAD * INLINE [
Дата Время Товар Количество Сумма
01.01.2020 14:32:00 Гвоздь 500 5000
02.01.2020 10:30:00 Шуруп 20 250
05.01.2020 16:51:00 Винт 300 4500
07.01.2020 13:47:00 Гайка 50 650
01.01.2020 10:43:00 Гвоздь 500 5000
02.01.2020 11:43:00 Винт 300 4500
05.01.2020 12:43:00 Гайка 50 650
] (delimiter is spaces);Продажи2:
LOAD * RESIDENT Продажи;
Результатом выполнения скрипта будет не две таблицы, а одна. Таблица Продажи2 даже не будет создана — все строки таблицы Продажи загрузятся в нее же. Такая ошибка очень распространена у новичков. Чтобы избежать автоматического объединения двух таблиц используется префикс NOCONCATENATE. Префикс указывается перед оператором LOAD который может вызвать автоматическое объединение таблицы и результатов указанного ниже LOAD или SELECT запроса:
Продажи:
LOAD * INLINE [
Дата Время Товар Количество Сумма
01.01.2020 14:32:00 Гвоздь 500 5000
02.01.2020 10:30:00 Шуруп 20 250
05.01.2020 16:51:00 Винт 300 4500
07.01.2020 13:47:00 Гайка 50 650
01.01.2020 10:43:00 Гвоздь 500 5000
02.01.2020 11:43:00 Винт 300 4500
05.01.2020 12:43:00 Гайка 50 650
] (delimiter is spaces);
Продажи2:
NOCONCATENATE LOAD * RESIDENT Продажи;
Такой скрипт уже создаст две таблицы Продажи и Продажи2.