Задача и предварительные условия

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

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

Учебные входные данные

sales.csv

ID;Qty
1;2
2.0;5
4;1

prices.csv

ID;Price
1.0;5
2;3
3;4

Блоки, связи и точные настройки

Поясняющая схемаУвеличить ↗08. Соединение продаж со справочником цен. Схема примера 08: 4 блока, 3 связи. Идентификаторы узлов и порты настроенной схемы сохранены.
Схема потока 08

Схема примера 08: блоков — 4, связей — 3. Идентификаторы узлов и порты настроенной схемы сохранены.

Добавьте перечисленные блоки в конструкторе, откройте свойства каждого и задайте эти значения. Имена demo_* обозначают учебные источники и подключения.

БлокНастройка
1
Файл
sales
  • Роль: source
  • Источник: demo_join_sales
  • Настройки чтения:
    • Лист: CSV
    • Диапазон: A1:B4
    • Первая строка — заголовок: так
    • Разделитель: ;
2
Файл
prices
  • Роль: source
  • Источник: demo_join_prices
  • Настройки чтения:
    • Лист: CSV
    • Диапазон: A1:B4
    • Первая строка — заголовок: так
    • Разделитель: ;
3
Соединение таблиц
join
  • Входы:
      • Идентификатор: sales
      • alias: sales
      • Идентификатор: prices
      • alias: prices
      • Тип соединения: left
      • Уникальность ключей: many_to_one
      • Ключи:
          • Левое поле: sales.ID
          • Правое поле: ID
          • Числовое сравнение: так
  • Пустые ключи равны: ні
  • Десятичный разделитель: .
4
Экспорт данных
out
  • Формат: json
  • Имя файла: sales_with_prices
  • Назначение: download
  • Разделитель: ;
  • Часовой пояс: Europe/Kyiv

Связи портов

  • sales out → join sales
  • prices out → join prices
  • join out → out in
Полная конфигурация схемы в JSON
{
  "version": 3,
  "nodes": [
    {
      "id": "sales",
      "type": "file",
      "label": "sales",
      "config": {
        "role": "source",
        "source_id": "demo_join_sales",
        "options": {
          "sheet": "CSV",
          "range": "A1:B4",
          "header": true,
          "delimiter": ";"
        }
      }
    },
    {
      "id": "prices",
      "type": "file",
      "label": "prices",
      "config": {
        "role": "source",
        "source_id": "demo_join_prices",
        "options": {
          "sheet": "CSV",
          "range": "A1:B4",
          "header": true,
          "delimiter": ";"
        }
      }
    },
    {
      "id": "join",
      "type": "join",
      "label": "join",
      "config": {
        "inputs": [
          {
            "id": "sales",
            "alias": "sales"
          },
          {
            "id": "prices",
            "alias": "prices",
            "how": "left",
            "cardinality": "many_to_one",
            "keys": [
              {
                "left": "sales.ID",
                "right": "ID",
                "numeric": true
              }
            ]
          }
        ],
        "nulls_equal": false,
        "decimal": "."
      }
    },
    {
      "id": "out",
      "type": "export",
      "label": "out",
      "config": {
        "format": "json",
        "filename": "sales_with_prices",
        "destination": "download",
        "delimiter": ";",
        "timezone": "Europe/Kyiv"
      }
    }
  ],
  "edges": [
    {
      "source": "sales",
      "target": "join",
      "source_port": "out",
      "target_port": "sales"
    },
    {
      "source": "prices",
      "target": "join",
      "source_port": "out",
      "target_port": "prices"
    },
    {
      "source": "join",
      "target": "out",
      "source_port": "out",
      "target_port": "in"
    }
  ]
}

Ожидаемый результат

sales.IDsales.Qtyprices.IDprices.Price
121.05
2.0523
41NULLNULL

Числовое сравнение считает 1 и 1.0 равными. LEFT JOIN сохраняет ID=4 с пустой ценой.

Запуск и проверка

  1. Добавьте оба источника и подключите к отдельным именованным входам соединения.
  2. Задайте sales первым входом без ключей; ключи определите для второго входа prices.
  3. Запустите и проверьте 3 строки; у ID=4 должен быть NULL, а не случайно подставленная цена.

Частые ошибки

  • Левый ключ должен включать псевдоним: sales.ID, а не просто ID.
  • Две цены одного ID нарушают many_to_one и должны быть исправлены в справочнике.
  • При отключённом numeric текстовые значения "2.0" и "2" не равны.