2010-11-20 9 views
11

Ich habe 3 verschiedene SQL-Abfragen aus 3 verschiedenen Tabellen ohne Bezug (alle mit LIMIT und ORDER BY).PosgreSQL: Wie Union 3 Tabellen nach Datum sortiert

Ich möchte die Ergebnisse nach dem „Datum“ Feld

Was die SQL dies zu tun ist (die in allen von ihnen angezeigt wird) fusionieren und sortieren?

Antwort

15

Am besten erstellen Sie eine neue Tabelle mit den gemeinsamen Feldern aus den drei anderen Tabellen und fügen einen Index für das Feld für das gemeinsame Datum hinzu. Die ursprünglichen drei Tabellen sollten einen Fremdschlüssel enthalten, der mit der allgemeinen Tabelle verknüpft ist. Mit diesem Design wird die Abfrage einfach:

SELECT * 
FROM common_table 
ORDER BY "date" DESC 
LIMIT 100 

Wenn Sie auch Daten aus den spezifischeren Tabellen benötigen, können Sie auch links in derselben Abfrage verwenden Joins, die Daten auszuwählen.

Wenn Sie nicht Ihr Design ändern und die Leistung ist kein Problem, dann können Sie UNION ALL verwenden, um die Ergebnisse aus allen drei Tabellen zu kombinieren vor dem Sortieren:

SELECT * FROM table1 
UNION ALL 
SELECT * FROM table2 
UNION ALL 
SELECT * FROM table3 
ORDER BY "date" DESC 
LIMIT 100 

Beachten Sie, dass die oben funktioniert nur, wenn Alle Tabellen haben die gleiche Struktur. Wenn Sie Felder haben, die in einer Tabelle vorkommen, aber nicht in anderen, dann sollten Sie sie aus dem SELECT weglassen oder sonst NULL für diese Spalte in den anderen Tabellen zurückgeben. wenn zum Beispiel:

  • table1 hat Spalten a, b, c und date.
  • table2 hat Spalten b, c und date.
  • hat Spalten a, c und date.

Dann verwenden:

SELECT a, b, c, "date" 
FROM table1 
UNION ALL 
SELECT NULL AS a, b, c, "date" 
FROM table2 
UNION ALL 
SELECT a, NULL as b, c, "date" 
FROM table3 
ORDER BY "date" DESC 
LIMIT 100 
+3

Wie wäre es mit der Leistung, wenn drei Tabellen viele Datensätze haben? – vietean

9
SELECT..... 
UNION ALL 
SELECT.... 
UNION ALL 
SELECT ... 
ORDER BY date_field; 

Für die beste Leistung gilt ORDER BY/LIMIT so spät wie möglich, und es in Unterabfragen zu vermeiden.