01.04.2023, Vladimír Klaus, navštíveno 469x

SQL
SQL Server

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:

  1. 37 %
  2. 49 %
  3. 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.