Задача и предварительные условия
Присоедините цены к продажам по числовому ключу, сохраняя строки без цены.
В примере используются демонстрационные данные и настройки. Проверьте ожидаемый результат в своей среде до подключения рабочих получателей. Идентификаторы 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: блоков — 4, связей — 3. Идентификаторы узлов и порты настроенной схемы сохранены.
Добавьте перечисленные блоки в конструкторе, откройте свойства каждого и задайте эти значения. Имена demo_* обозначают учебные источники и подключения.
| Блок | Настройка |
|---|---|
| 1 Файл sales |
|
| 2 Файл prices |
|
| 3 Соединение таблиц join |
|
| 4 Экспорт данных out |
|
Связи портов
- sales
out→ joinsales - prices
out→ joinprices - join
out→ outin
Полная конфигурация схемы в 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.ID | sales.Qty | prices.ID | prices.Price |
|---|---|---|---|
| 1 | 2 | 1.0 | 5 |
| 2.0 | 5 | 2 | 3 |
| 4 | 1 | NULL | NULL |
Числовое сравнение считает 1 и 1.0 равными. LEFT JOIN сохраняет ID=4 с пустой ценой.
Запуск и проверка
- Добавьте оба источника и подключите к отдельным именованным входам соединения.
- Задайте sales первым входом без ключей; ключи определите для второго входа prices.
- Запустите и проверьте 3 строки; у ID=4 должен быть NULL, а не случайно подставленная цена.
Частые ошибки
- Левый ключ должен включать псевдоним: sales.ID, а не просто ID.
- Две цены одного ID нарушают many_to_one и должны быть исправлены в справочнике.
- При отключённом numeric текстовые значения "2.0" и "2" не равны.