Pourquoi ai-je eu un nombre de lignes plus élevé après LEFT JOIN

En essayant de JOINDRE set différents sets de données pour get une table principale, bien que j'ai réussi à préserver le nombre de lignes après 3 jointures à gauche, mais après l'étape suivante, il semble l'augmenter. Des idées pourquoi?

Requête avec 3 jointures

------------------------------------------------------------------- --- STEP 4: ---------------- ------------------------------------------------------------------- SELECT DISTINCT Table1.[Field1] , Table1.[Field2] , Table3.[Field3] , Table1.[Field4] , Table1.[Field5] , Table1.[Field6] , Table1.[Field7] , Table1.[Field8] , Table1.[Field9] , Table1.[Field10] FROM db1.dbo.raw_tbl_1 AS Table1 LEFT JOIN db2.dbo.tbl_2 Table2 ON Table1.Field7 = Table2.[Field13] LEFT JOIN db2.dbo.tbl_3 Table3 ON CONVERT(INT,Table1.[Field2]) = Table3.Field14 LEFT JOIN db2.dbo.tbl_4Table4 ON Table2.Field17= Table4. Field15 WHERE Table2. Field17 IS NOT NULL -- 2682270 rows (Desired row count) 

Requête avec 4 jointures (celle qui augmente le nombre de lignes)

 ------------------------------------------------------------------- --- STEP 5: ---- ------------------------------------------------------------------- SELECT DISTINCT Table1.[Field1] , Table1.[Field2] , Table3.[Field3] , Table1.[Field4] , Table1.[Field5] , Table1.[Field6] , Table1.[Field7] , Table5.[Field11] , Table6.[Field12] , Table1.[Field8] , Table1.[Field9] , Table1.[Field10] FROM db1.dbo.raw_tbl_1 AS Table1 LEFT JOIN db2.dbo.tbl_2 Table2 ON Table1.Field7 = Table2.[Field13] LEFT JOIN db2.dbo.tbl_3 Table3 ON CONVERT(INT,Table1.[Field2]) = Table3. Field14 LEFT JOIN db2.dbo.tbl_4 Table4 ON Table2. Field17= Table4. Field15 LEFT JOIN db2.dbo.tbl_5 Table5 ON Table4. Field18= Table5. Field16 LEFT JOIN db2.dbo.tbl_6 Table6 ON Table5.[Field11] = CONVERT(INT,Table6.[Table6]) WHERE Table2.Field17 IS NOT NULL 

Si l'une des tables de LEFT JOIN a plus d'une valeur correspondante, elle créera une nouvelle ligne. Si vous ne voulez pas ce comportement, vous devez utiliser une fonction d'agrégation et GROUP BY .

Plus précisément, si vous faites une requête en utilisant uniquement les dernières tables que vous avez jointes (celles qui provoquent les nouvelles lignes), vous pourrez find les lignes en double et décider comment vous voulez gérer cela.


Puisque vous mentionnez que la dernière jointure est à l'origine du problème, cela signifie que Table6 renvoie plus de lignes que vous ne le pensez. Vous devrez faire quelque chose comme:

  SELECT Table5.Field11, COUNT(Table6.Table6) AS row_count FROM Table5 LEFT JOIN db2.dbo.tbl_6 Table6 ON Table5.[Field11] = CONVERT(INT,Table6.[Table6]) GROUP BY Field11 HAVING row_count > 1 

(La clause HAVING suppose que vous attendez une correspondance de 1 à 1 entre les tables, sinon laissez-la de côté). Vous devrez searchr manuellement où Table6 renvoie plus de lignes que prévu, puis modifier votre requête ou supprimer des données en conséquence.