2010-11-01 4 views
15

Ich setze innere beitreten in meine Abfrage.Ich habe das Ergebnis, aber wusste nicht, wie die Daten in der Ausgabe kommen.Kann mir jemand sagen, wie die innere Join die Daten übereinstimmen Ich zeige ein Bild. Es gibt zwei Tabellen (eine oder zwei Tabellen).Sortieren nach in Inner Join

alt text

Nach mir, dass erste Zeile sollte es Mohit sein, aber Ausgang ist mir different.Please zu sagen.

Vielen Dank im Voraus.

Antwort

3

Sie haben es zu sortieren, wenn Sie die Daten wollen eine bestimmte Art und Weise kommen. Wenn Sie sagen, dass Sie "Mohit" erwarten, um die erste Zeile zu sein, nehme ich an, dass Sie das sagen, weil "Mohit" die erste Zeile in der Tabelle [One] ist. Wenn SQL Server jedoch Tabellen verknüpft, wird er nicht notwendigerweise in der Reihenfolge angezeigt, in der Sie denken.

Wenn Sie möchten, dass die erste Zeile von [One] zurückgegeben wird, versuchen Sie, nach [One].[ID] zu sortieren. Alternativ können Sie jede andere Spalte order by.

+0

Danke für die Antwort. Ich weiß über Reihenfolge von Aber ich möchte wissen, wie Inner Join intern funktioniert? –

+0

Wenn Sie einen INNEREN JOIN ausführen, ermittelt SQL Server die beste Methode zum Suchen der übereinstimmenden Zeilen (verschachtelte Schleifen usw.). Dies führt zu einer zufälligen Reihenfolge der Ergebnisse. – dotariel

+2

Wer weiß, ob ich (speziell für SQLite) erzwingen kann, dass der Join "geordnet" wird? –

3

Fügen Sie am Ende Ihrer ersten Abfrage eine ORDER BY ONE.ID ASC hinzu.

Standardmäßig gibt es keine Bestellung.

+0

aber bei der Auswahl der Datensätze aus der Tabelle, die Zeit Standard-Reihenfolge von ist "ASC" – Vijjendra

+0

Danke für die Antwort. Ich weiß über Order by Aber ich möchte wissen, wie Inner Join intern funktioniert? –

+0

@Mohit - Es gibt keine natürliche Reihenfolge, sobald Sie das 'JOIN' machen. Die Ergebnisse, die Sie erhalten haben, waren korrekt, aber ungeordnet. Ihre einzelne Tabelle SELECT ist in der Reihenfolge, in der es wahrscheinlich wegen eines gruppierten Indexes ist. – JNK

9

In SQL ist die Reihenfolge der Ausgabe nicht definiert, es sei denn, Sie geben sie in der ORDER BY-Klausel an.

Try this:

SELECT * 
FROM one 
JOIN two 
ON  one.one_name = two.one_name 
ORDER BY 
     one.id 
+0

+1: Mit einer 'ORDER BY'-Klausel ist die Reihenfolge wahrscheinlich nicht zufällig und wahrscheinlich vorhersehbar (ausreichende Informationen vorausgesetzt), aber der Punkt ist" Ausgabe ist nicht definiert ". – onedaywhen

+0

Danke für die Antwort.Ich weiß über Reihenfolge von Aber ich möchte wissen, wie Inner Join intern funktioniert? –

+0

Erstellen Sie den Plan für Ihre Abfrage (drücken Sie einfach 'Strg-L' im Abfragefenster), es zeigt Ihnen den Algorithmus. – Quassnoi

1

SQL gibt standardmäßig keine Reihenfolge zurück, weil es auf diese Weise schneller ist. Es muss nicht zuerst Ihre Daten durchgehen und dann entscheiden, was zu tun ist.

Sie müssen eine order by-Klausel hinzufügen und wahrscheinlich nach welcher ID auch immer, die Sie erwarten. (Es gibt ein Duplikat von Namen, also würde ich nehme an, Sie wollen One.ID)

select * From one 
inner join two 
ON one.one_name = two.one_name 
ORDER BY one.ID 
4

Vermeiden SELECT * in Ihrer Hauptabfrage.

Vermeiden Sie doppelte Spalten: die JOIN Bedingung stellt sicher, One.One_Name und two.One_Name gleich also Sie nicht beide in der SELECT Klausel zurückgeben müssen.

Doppelte Spaltennamen vermeiden: Umbenennen One.ID und Two.ID mit 'Aliase'.

Fügen Sie eine ORDER BY-Klausel hinzu, indem Sie die Spaltennamen (ggf. 'alises') aus der SELECT-Klausel verwenden.

Vorgeschlagene neu zu schreiben:

SELECT T1.ID AS One_ID, T1.One_Name, 
     T2.ID AS Two_ID, T2.Two_name 
    FROM One AS T1 
     INNER JOIN two AS T2 
      ON T1.One_Name = T2.One_Name 
ORDER 
    BY One_ID; 
-1

Ja Mohit smirkingman ist richtig. Selbst wenn Sie Order by Klausel verwenden, ohne Reihenfolge als Assending oder Desending große Datenbank angeben gibt Ihnen unvorhersehbare Antworten