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
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.
| Bloc | Paramètre |
|---|---|
| 1 Fichier sales |
|
| 2 Fichier prices |
|
| 3 Jointure join |
|
| 4 Exportation de données out |
|
Connexions des ports
- sales
out→ joinsales - prices
out→ joinprices - join
out→ outin
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.ID | sales.Qty | prices.ID | prices.Price |
|---|---|---|---|
| 1 | 2 | 1.0 | 5 |
| 2.0 | 5 | 2 | 3 |
| 4 | 1 | NULL | NULL |
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
- Ajoutez les deux sources et connectez-les à des entrées nommées distinctes de Jointure.
- Définissez sales comme première entrée sans clés ; définissez les clés pour la seconde entrée, prices.
- 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.