Identifier les jointures qui font des dégâts !
Nous avons tous rencontré cette jointure explosive, qui se multiplie de manière inattendue ou qui devient incontrôlable. Auparavant, nous plongions profondément dans nos données, essayant de trouver la jointure coupable. Désormais, créons une fonction pour simplifier ce travail de détective.
Votre défi cette semaine : concevez une fonction qui prend une query ID et repère toutes les jointures à l’intérieur de celle-ci produisant plus de lignes que le ratio anticipé de 1:1. Pour clarifier: si une jointure prend 10 lignes du côté gauche et 80 du côté droit, mais aboutit à plus de 80 lignes, votre fonction devrait le signaler!
Code de départ:
–Schema creation
create or replace schema week_63;
–T1 creation
CREATE TABLE t1 (value CHAR(1));
INSERT INTO t1
SELECT ‘a’ FROM (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10) AS temp1
UNION ALL
SELECT ‘b’ FROM (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12 UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL SELECT 15 UNION ALL SELECT 16 UNION ALL SELECT 17 UNION ALL SELECT 18 UNION ALL SELECT 19 UNION ALL SELECT 20) AS temp2
UNION ALL
SELECT ‘c’ FROM (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12 UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL SELECT 15 UNION ALL SELECT 16 UNION ALL SELECT 17 UNION ALL SELECT 18 UNION ALL SELECT 19 UNION ALL SELECT 20 UNION ALL SELECT 21 UNION ALL SELECT 22 UNION ALL SELECT 23 UNION ALL SELECT 24 UNION ALL SELECT 25 UNION ALL SELECT 26 UNION ALL SELECT 27 UNION ALL SELECT 28 UNION ALL SELECT 29 UNION ALL SELECT 30) AS temp3
UNION ALL
SELECT ‘d’ FROM (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12 UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL SELECT 15 UNION ALL SELECT 16 UNION ALL SELECT 17 UNION ALL SELECT 18 UNION ALL SELECT 19 UNION ALL SELECT 20) AS temp4
;
— Create table t2 and insert one ‘b’ value
CREATE TABLE t2 (value CHAR(1));
INSERT INTO t2 (value) VALUES (‘b’);
— Create table t3 and insert ten ‘c’ values
CREATE TABLE t3 (value CHAR(1));
INSERT INTO t3
SELECT ‘c’ FROM (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10) AS temp;
— Create table t4 and insert one ‘d’ value
CREATE TABLE t4 (value CHAR(1));
INSERT INTO t4 (value) VALUES (‘d’);
La requête que nous aimerions que vous vérifiiez :
Requête
SELECT *
FROM t1
LEFT JOIN t2 ON t1.value = t2.value
LEFT JOIN t3 ON t1.value = t3.value
LEFT JOIN t4 ON t1.value = t4.value;
Le résultat de votre fonction devrait être similaire à ceci :
Et n’oubliez pas, si vous souhaitez participer aux défis:
1. Inscrivez-vous en tant que membre de Frosty Friday. –> Vous pouvez le faire en cliquant sur la barre latérale, puis en cliquant sur ‘S’INSCRIRE’ (notez que s’inscrire à notre liste de diffusion ne vous donne pas de compte Frosty Friday).
2. Publiez votre code sur GitHub et rendez-le accessible au public (consultez notre guide si vous ne savez pas comment faire, disponible ici)
3. Postez l’URL dans les commentaires du défi.