2017-10-31 12 views
1

Warum gibt mein inner join mehr Datensätze als die größte Tabelle der Abfrage zurück? Diese Abfrage gibt 69 899 DatensätzeInnerer Join scheint zu viele Zeilen zurückzugeben

:

select count(*) 
    from [email protected]_connection dd 
inner join [email protected]_connection pr 
    on dd."ProjectRef" = pr."ProjectRef" 

Während diese Abfrage 29 486 Datensätze zurückgibt

select count(*) 
    from [email protected]_connection 

Und diese Abfrage Rückkehr 179 Datensätze

select count(*) 
    from [email protected]_connection 

Diese beiden Tabellen abgefragt werden Verwenden eines dblinks in einer MySql-Datenbank.

+2

wegen einer Eins-zu-viele-Beziehung. –

Antwort

2

Warum gibt meine innere Verknüpfung mehr Datensätze als die größte Tabelle der Abfrage zurück?

Da entweder die erste Tabelle oder die zweite Tabelle oder beide doppelte Werte in der Spalte ProjectRef enthalten.
Bitte nehmen Sie sich einen Blick auf diesem einfachen Beispiel zu sehen, was diese Situation verursachen könnte: geben kann http://sqlfiddle.com/#!9/fcd040/3

select * from a; 

| a_id | a_name | 
|------|--------| 
| 1 |  A1 | 
| 1 |  A2 | 
| 1 |  A3 | 

select * from b; 

| b_id | b_name | 
|------|--------| 
| 1 |  B1 | 
| 1 |  B2 | 
| 1 |  B3 | 

select * from a 
join b 
on a.a_id = b.b_id; 

| a_id | a_name | b_id | b_name | 
|------|--------|------|--------| 
| 1 |  A1 | 1 |  B1 | 
| 1 |  A2 | 1 |  B1 | 
| 1 |  A3 | 1 |  B1 | 
| 1 |  A1 | 1 |  B2 | 
| 1 |  A2 | 1 |  B2 | 
| 1 |  A3 | 1 |  B2 | 
| 1 |  A1 | 1 |  B3 | 
| 1 |  A2 | 1 |  B3 | 
| 1 |  A3 | 1 |  B3 | 

Dieses Beispiel zeigt, warum das Ergebnis der Verbindung Sie viele weitere Datensätze als enthält die größte der Tabellen.

2

Um die Anzahl der Zeilen, die Sie zurückgeschickt werden erwarten:

select sum(dd.cnt * pr.cnt) 
from (select "ProjectRef", count(*) as cnt 
     from [email protected]_connection 
     group by "ProjectRef" 
    ) dd join 
    (select "ProjectRef", count(*) as cnt 
     from [email protected]_connection 
     group by "ProjectRef" 
    ) pr 
    on dd."ProjectRef" = pr."ProjectRef"; 

Ich bin ziemlich sicher, diese 69.899 zurück. Sie können die Ergebnisse der Unterabfragen untersuchen, um zu verstehen, was mit doppelten Projektreferenzen geschieht.

Verwandte Themen