Ne confondez jamais la logique séquentielle du DATA MERGE avec l'algèbre relationnelle du SQL : le premier juxtapose les lignes là où le second crée un produit cartésien. Dans une relation "Many-to-Many", l'utilisation du MERGE faussera silencieusement vos résultats en ne générant pas toutes les combinaisons. Si vos clés ne sont uniques dans aucune des deux tables, délaissez l'étape Data au profit d'une jointure explicite via PROC SQL.
Une croyance répandue veut que l'instruction MERGE de l'étape DATA soit l'équivalent exact d'une jointure SQL (LEFT JOIN ou FULL JOIN). Si cela est vrai pour des relations simples (1-pour-1 ou 1-pour-N), c'est totalement faux pour des relations de type "Many-to-Many" (N-pour-N).
Le constat : Des résultats divergents
Prenons un exemple simple où la clé de jointure (ID) apparaît plusieurs fois dans les deux tables :
Table 1 : ID 23456 apparaît 2 fois.
Table 2 : ID 23456 apparaît 2 fois.
Si nous cherchons à combiner ces données, nous nous attendons mathématiquement à obtenir $2 \times 2 = 4$ lignes (le produit cartésien pour cet ID).
Note : L'approche PROC SQL (Produit Cartésien)
Le SQL fonctionne sur une logique d'ensemble (algèbres relationnelle). Il combine chaque ligne de la table A avec chaque ligne correspondante de la table B.
PROC SQL;
SELECT * FROM dataset1 t1
LEFT JOIN dataset2 t2 ON t1.ID = t2.ID;
QUIT;
1
PROC SQL;
2
SELECT * FROM dataset1 t1
3
LEFT JOIN dataset2 t2 ON t1.ID = t2.ID;
4
QUIT;
Résultat : 4 lignes pour l'ID 23456. Toutes les combinaisons possibles sont créées. C'est le comportement standard d'une base de données relationnelle.
Note : L'approche DATA MERGE (Juxtaposition séquentielle)
L'étape DATA fonctionne ligne par ligne de manière séquentielle. Elle place les pointeurs de lecture "côte à côte".
Utilisez PROC SQL si vous avez besoin d'un produit cartésien (relation N-pour-N), c'est-à-dire croiser toutes les occurrences possibles. C'est souvent le résultat attendu pour des analyses croisées.
Utilisez DATA MERGE pour des relations 1-pour-1 ou 1-pour-N (type "Look-up" / Enrichissement de données). C'est beaucoup plus performant en termes de temps de calcul sur de gros volumes, tant que les clés sont uniques dans au moins l'une des deux tables.
Note technique : Il est techniquement possible de simuler un produit cartésien avec une étape DATA (en utilisant deux instructions SET et des boucles explicites), mais le code devient inutilement complexe. Dans ce cas précis, la clarté du SQL est imbattable.
Avertissement important
Les codes et exemples fournis sur WeAreCAS.eu sont à but pédagogique. Il est impératif de ne pas les copier-coller aveuglément sur vos environnements de production. La meilleure approche consiste à comprendre la logique avant de l'appliquer. Nous vous recommandons vivement de tester ces scripts dans un environnement de test (Sandbox/Dev). WeAreCAS décline toute responsabilité quant aux éventuels impacts ou pertes de données sur vos systèmes.
SAS et tous les autres noms de produits ou de services de SAS Institute Inc. sont des marques déposées ou des marques de commerce de SAS Institute Inc. aux États-Unis et dans d'autres pays. ® indique un enregistrement aux États-Unis. WeAreCAS est un site communautaire indépendant et n'est pas affilié à SAS Institute Inc.
Ce site utilise des cookies techniques et analytiques pour améliorer votre expérience.
En savoir plus.