2009-09-02 1 views
0

Ich habe eine Tabelle wie diese sortieren:wie SQL Ergebnis unter Verwendung eines vorher definierten Reihe von Zeilen

-------------------------------- 
id | name 
-------------------------------- 
1 | aa 
2 | aa 
3 | aa 
4 | aa 
5 | bb 
6 | bb 
... one million more ... 

und Ich mag zu erhalten, eine beliebige Anzahl von Zeilen in einer vordefinierten Sequenz und anderer Reihen sortiert nach ihrem Namen. z.B. Ich habe eine kurze Sequenz mit 3-IDs in einer anderen Tabelle:

sequ_no | id  | pos 
----------------------- 
1  | 3  | 0 
1  | 1  | 1 
1  | 2  | 2 
2  | 65535 | 0 
2  | 45 | 1 
... one million more ... 

Sequenz 1 die folgende Reihe von IDs definiert: [3, 1, 2]. Wie erhält man die drei Zeilen der ersten Tabelle in dieser Reihenfolge und den Rest der nach ihrem Namen sortierten Zeilen? wie in PostgreSQL und wie in mySQL? Wie würde eine Lösung in hql aussehen (Hibernate-Abfragesprache)?

Eine Idee, die ich habe, besteht darin, die Zeilen, die in der Sequenz definiert sind, zuerst abzufragen und zu sortieren und dann die anderen Zeilen, die nicht in der Reihenfolge sind, zu erfassen. aber das beinhaltet zwei Anfragen, kann es mit einem getan werden?

Update: Das Endergebnis für die Probensequenz [3, 1, 2] (wie oben definiert) soll wie folgt aussehen:

id | name 
---------------------------------- 
3 | aa 
1 | aa 
2 | aa 
4 | aa 
5 | bb 
6 | bb 
... one million more ... 

ich brauche diese Abfrage eine Paginierung durch ein Produkt zu erstellen Tabelle, wo ein Teil der Sequenz von Produkten eine definierte Sequenz ist und der Rest der Produkte nach einer Klausel bestellt wird, die ich noch nicht kenne.

Antwort

0

Ich bin mir nicht sicher, ob ich die genaue Anforderung verstehen, aber nicht diese Arbeit:

SELECT ids.id, ids.name 
FROM ids_table ids LEFT OUTER JOIN sequences_table seq 
WHERE ids.id = seq.id 
ORDER BY seq.sequ_no, seq.pos, ids.name, ids.id 
+0

die Sequenztabelle doesnt enthält jede pdoruct, einen nur von ihnen nur wenige. vielleicht 20 von 500.000 – Chris

+0

Geändert zu LEFT OUTER JOIN. Auch hier bin ich nicht 100% auf Ihre Anforderung. Könnten Sie bitte ein Beispiel dafür geben, wie Sie die Ausgabe erwarten? Möchten Sie auf eine Sequenz beschränken? Oder alles nach der Sequenznummer bestellen? –

0

Ein Weg: jeder ID, die noch keine Position hat, eine Position (zB 0) zuweisen, UNION das Ergebnis mit der zweiten Tabelle, das Ergebnis mit der ersten Tabelle verknüpfen, und ORDER BY seq_no, pos, name .

Verwandte Themen