Wie zum verknüpfen von zwei Tabellen zusammen mit der gleichen Anzahl von Zeilen von Ihrer Bestellung
Ich bin mit SQL2000 und ich würde gerne join zwei Tabellen zusammen, basierend auf Ihren Positionen
Betrachten Sie beispielsweise die folgende 2 Tabellen:
Tabelle1 ------- name ------- 'Katze' 'Hund' 'Maus' Tabelle2 ------ Kosten ------ 23 13 25
Ich würde jetzt gerne blind Verknüpfung der zwei Tabellen zusammen, wie folgt, basierend auf Ihrer Bestellung nicht auf eine übereinstimmende Spalten (ich kann auch garantieren beide Tabellen haben die gleiche Anzahl von Zeilen):
------- | ----- name |Kosten ------- | ------ "Katze" |23 'Hund' |13 'Maus'|25
Ist das möglich, in einem T-SQL-select??
- warum.....nur warum sollte man eine Datenbank aufbauen, um auf diese Weise verwendet werden? Der ganze Sinn von Datenbanken besteht darin, nicht tun diese Art der Sache.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist NICHT möglich, da es absolut keine Garantie über die Reihenfolge, in der die Zeilen ausgewählt werden.
Gibt es eine Reihe von Möglichkeiten, um zu erreichen, was Sie wollen (siehe andere Antworten) vorausgesetzt, Sie sind glücklich über die Sortierung, aber keiner wird zur Arbeit, wenn Sie nicht sind, und Sie sollten nicht darauf verlassen, dass solche Abfragen.
Gezwungen, das zu tun diese Art der Abfragen stark riecht nach einem schlechten Datenbank-design.
2000 müssen Sie entweder führen Sie 2 forward nur Cursor und fügen Sie diesen in eine temp-Tabelle. oder legen Sie die Werte in eine temporäre Tabelle mit einer extra Spalte id und join die 2 temp-Tabellen über das id-Feld
Wenn Ihre Tabellen nicht zwei große, Sie konnte erzeugen zwei temporäre Tabellen im Speicher und wählen Sie Ihre Inhalte in einer bestimmten Reihenfolge, und dann kommen Sie auf die Zeilennummer.
z.B.
Tun Sie etwas, was garantiert, dass die Bestellung der einzelnen Tabellen?
So weit ax I know, SQL-server macht keine Versprechen auf die Bestellung eines resultset-es sei denn, die äußeren Abfrage eine order by-Klausel.
In Ihrem Fall müssen Sie Jede Tabelle bestellt werden, in einer deterministischen Art und Weise für diese zu arbeiten.
Andere als die, die in SQL 2000, wie schon vor mir beantwortet, dass eine temp-Tabelle und zwei Cursor scheinen, wie eine gute Antwort.
Update:
Jemand erwähnte, einfügen beide Tabellen in temp-Tabellen, und das würde es bringen bessere Leistung. Ich bin kein SQL-Experte, so dass ich verschieben, um diejenigen, die wissen, an dieser front, und da hatte ich ein up-vote ich dachte, Sie sollten Sie untersuchen diese auf die Leistung auswirkt.
Aber in jedem Fall, wenn Sie nicht über alle anderen Informationen in den Tabellen, als das, was Sie uns zeigte, ich bin nicht sicher, können Sie es abziehen, Bestell-Weise.
Könnte man ändern, beide Tabellen haben eine auto_increment-Spalte, dann kommen Sie auf das.
Als andere haben dir gesagt, SQL ist keine intrinsische Bestellung; Tabelle der Zeilen ist festgelegt. Jede Bestellung erhalten Sie willkürlich ist, , es sei denn fügen Sie eine
order by
- Klausel.Also ja, es gibt Möglichkeiten, wie Sie dies tun können, aber alle von Ihnen sind abhängig von der zufälligen Bestellung sind, was Sie hoffen, dass es ist. So mache dies mal, und Mach es nicht wieder, es sei denn, Sie können kommen mit einem Weg (auto_increments, natürlichen Schlüssel, so), um sicherzustellen bestellen.
Absolut. Verwenden Sie die folgende Abfrage, aber stellen Sie sicher, dass die (order by) Klausel verwendet die gleichen Spalten die Reihenfolge der Zeilen ändern, die Sie nicht wollen.
order by-Klausel kann geändert werden entsprechend der Benutzer-Verknüpfungen
Obige Abfrage fertigt einzigartige row_numbers für jede Zeile, die ein gemeinsam mit row_numbers der anderen Tabelle
Prüfen, mit einem Rang (rownum in Oracle) dynamisch gelten bestellten eindeutige Nummern für jede Tabelle. Dann lassen Sie sich auf die rank-Spalte, und Sie sollten haben, was Sie brauchen. Sehen Sie diese Microsoft-Artikel-Nummerierung von Zeilen.
wäre am besten zu verwenden, row_number(), aber das ist nur für 2005 und 2008 sollte diese Arbeit für 2000...
Versuchen Sie dies:
Xynth - gebaut in die Zeilennummerierung ist nicht verfügbar, bis SQL2K5 leider, und das Beispiel microsoft tatsächlich verwendet dreieckige tritt - eine horrende versteckte performance-hit wenn die Tabellen groß werden. Mein bevorzugter Ansatz wäre eine Einfügung in ein paar temporäre Tabellen mithilfe der identity-Funktion und dann kommen Sie auf diese, das ist im Grunde die gleiche Antwort schon gegeben. Ich denke, die zwei-Cursor-Ansatz klingt viel schwerer als es sein muss für diese Aufgabe.