01.04.2023, Vladimír Klaus, navštíveno 599x
V tomto článku lehce navážu na předchozí, který se týkal v podstatě téhož. Bude to ale vysvětleno na trochu jiných příkladech a přibude ještě třetí řešení, které se ukazuje jako nejoptimálnější. Vše je prováděno na SQL Serveru, čemuž odpovídá syntaxe, resp. použité funkce.
Verze 1
V zásadě jde o situaci, kdy mám tabulku s nějakými sadami a ke každé sadě potřebuji připojit nejnovější záznam z tabulky s platformami. SQL Server má pro tyto účely skvělé nástroje jako je OVER a PARTITION BY, což bylo vysvětleno v předchozím článku.
SELECT Sady.*, a.IdStavu AS ID_STAVU
FROM Sady
LEFT JOIN
(
SELECT IdSady, IdStavu FROM (
SELECT IdSady, IdStavu, Rank() OVER (PARTITION BY IdSady ORDER BY ID DESC) RankOrder
FROM Platformy
) r
WHERE RankOrder = 1
) a
ON a.IdSady=Sady.ID
Verze 2
Druhá, možná trochu jednodušší, verze vychází z toho, že si v poddotazu vyberu jeden záznam, a protože je tam sestupné řazení, tak je tento záznam nejnovější, a ten pak připojím k hlavnímu dotazu.
SELECT s.*,
(
SELECT TOP 1 IdStavu FROM Platformy p
WHERE p.IdSady = s.ID
ORDER BY p.ID DESC
) AS ID_STAVU
FROM Sady s
Verze 3
No a pak je tu třetí dotaz. Jeho zajímavost je v tom, že jednu tabulku připojuje 2x. Nejprve si vyzvedne největší ID (tedy nejnovější možný záznam) a pak na jeho základě k tomu připojí odpovídající IdSady. Toto bohužel nejde udělat v rámci jednoho dotazu. Nicméně i takto se jedná o nejrychlejší řešení!!!
SELECT t1.*, t2.IdStavu AS ID_STAVU
FROM Sady t1
LEFT JOIN (
SELECT IdSady, MAX(ID) as max_ID
FROM Platformy
GROUP BY IdSady
) Nejnovejsi_t2
ON t1.id = Nejnovejsi_t2.IdSady
LEFT JOIN Platformy t2
ON Nejnovejsi_t2.max_ID = t2.ID
Všechny verze dávají stejný výsledek, ale dle SSMS je náročnost (poměrově) takováto:
- 37 %
- 49 %
- 15 %
Samozřejmě to pro jiná data, využití jiných indexů a obecně jinou situaci může dopadnout jinak. Účelem tohoto krátkého článku bylo ale ukázat, že je možné stejnou věc řešit různými způsoby a nespokojit se hned s prvním řešením.