Objectif et prérequis

Joignez les prix aux ventes par une clé numérique en conservant les lignes sans prix.

Cet exemple utilise des données et paramètres de démonstration. Validez le résultat attendu dans votre propre environnement avant de connecter des destinations de production. Les identifiants demo_* sont illustratifs : sélectionnez vos propres connexions ou sources pédagogiques dans l’éditeur. Le JSON ci-dessous présente la structure des blocs et connexions, pas une archive de flux prête à transférer.

Données d’entrée pédagogiques

sales.csv

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

prices.csv

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

Blocs, connexions et paramètres exacts

Schéma explicatifAgrandir ↗08. Jointure : ventes et référentiel de prix. Topologie de l’exemple 08 : 4 blocs, 3 connexions. Les identifiants de nœuds et les ports du graphe configuré sont conservés.
Schéma du flux 08

Topologie de l’exemple 08 : 4 blocs, 3 connexions. Les identifiants de nœuds et les ports du graphe configuré sont conservés.

Ajoutez les blocs listés dans le concepteur, ouvrez les propriétés de chacun et définissez ces valeurs. Les noms demo_* désignent les sources et connexions pédagogiques.

BlocParamètre
1
Fichier
sales
  • Rôle: source
  • Source: demo_join_sales
  • Paramètres de lecture:
    • Feuille: CSV
    • Plage: A1:B4
    • La première ligne contient les en-têtes: так
    • Séparateur: ;
2
Fichier
prices
  • Rôle: source
  • Source: demo_join_prices
  • Paramètres de lecture:
    • Feuille: CSV
    • Plage: A1:B4
    • La première ligne contient les en-têtes: так
    • Séparateur: ;
3
Jointure
join
  • Entrées:
      • Identifiant: sales
      • alias: sales
      • Identifiant: prices
      • alias: prices
      • Type de jointure: left
      • Cardinalité: many_to_one
      • Clés:
          • Champ gauche: sales.ID
          • Champ droit: ID
          • Comparaison numérique: так
  • Les clés nulles sont égales: ні
  • Séparateur décimal: .
4
Exportation de données
out
  • Format: json
  • Nom du fichier: sales_with_prices
  • Rôle: download
  • Séparateur: ;
  • Fuseau horaire: Europe/Kyiv

Connexions des ports

  • sales out → join sales
  • prices out → join prices
  • join out → out in
Configuration complète du graphe en 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"
    }
  ]
}

Résultat attendu

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

La comparaison numérique considère 1 et 1.0 comme égaux. LEFT JOIN conserve ID=4 avec un prix vide.

Exécuter et vérifier

  1. Ajoutez les deux sources et connectez-les à des entrées nommées distinctes de Jointure.
  2. Définissez sales comme première entrée sans clés ; définissez les clés pour la seconde entrée, prices.
  3. Exécutez et vérifiez les 3 lignes ; ID=4 doit avoir NULL, et non un prix substitué par erreur.

Erreurs courantes

  • La clé gauche doit inclure son alias : sales.ID, pas seulement ID.
  • Deux prix pour un même ID enfreignent many_to_one et doivent être corrigés dans le référentiel.
  • Si numeric est désactivé, les textes « 2.0 » et « 2 » ne sont pas égaux.