sql >> Databáze >  >> RDS >> PostgreSQL

Efektivní dotaz na poslední záznam s Postgresql

Pokud nechcete svůj datový model měnit, můžete použít DISTINCT ON pro načtení nejnovějšího záznamu z tabulky "b" pro každý záznam v "a":

SELECT DISTINCT ON (a.id) *
FROM a
INNER JOIN b ON a.id=b.id
ORDER BY a.id, b.date DESC

Pokud se chcete vyhnout „třídění“ v dotazu, může přidat index jako tento pomoci, ale nejsem si jistý:

CREATE INDEX b_id_date ON b (id, date DESC)

SELECT DISTINCT ON (b.id) *
FROM a
INNER JOIN b ON a.id=b.id
ORDER BY b.id, b.date DESC

Případně, pokud chcete seřadit záznamy z tabulky "a" nějakým způsobem:

SELECT DISTINCT ON (sort_column, a.id) *
FROM a
INNER JOIN b ON a.id=b.id
ORDER BY sort_column, a.id, b.date DESC

Alternativní přístupy

Všechny výše uvedené dotazy však stále potřebují číst všechny odkazované řádky z tabulky "b", takže pokud máte hodně dat, může to být stále příliš pomalé.

Můžete vytvořit novou tabulku, která bude obsahovat pouze nejnovější záznam "b" pro každý a.id - nebo dokonce přesunout tyto sloupce do samotné tabulky "a".



  1. mysql (téměř) kompletní audit

  2. Změňte obsah na základě rozevíracího výběru z databáze mysql

  3. Procedura pro obrácení řetězce v PL/SQL

  4. Cizí klíč ke složenému klíči