sql >> Databáze >  >> RDS >> Mysql

MySQL/MariaDB - řazení podle vnitřního poddotazu

Po chvíli rýpání mohu potvrdit oba vaše scénáře:

MySQL 5.1 používá ORDER BY uvnitř poddotazu.

MariaDB 5.5.39 na Linuxu ne použijte ORDER BY uvnitř poddotazu, když není LIMIT je dodáván. dělá správně však aplikujte objednávku, když je odpovídající LIMIT je dáno:

SELECT t2.Code 
FROM (
  SELECT Country.Code FROM Country ORDER BY Country.Code DESC LIMIT 2
) AS t2;

Bez tohoto LIMIT , není dobrý důvod použít řazení uvnitř poddotazu. Lze jej ekvivalentně použít na vnější dotaz.

Zdokumentované chování:

Jak se ukázalo, MariaDB toto chování zdokumentovala a není to považováno za chybu:

"Tabulka" (a dílčí dotaz v FROM klauzule taky) je - podle standardu SQL - neuspořádaná sada řádků. Řádky v tabulce (nebo v poddotazu v FROM doložka) nepřicházejí v žádném konkrétním pořadí. Proto může optimalizátor ignorovat ORDER BY klauzuli, kterou jste uvedli. Ve skutečnosti SQL standard ani neumožňuje ORDER BY klauzule, aby se objevila v tomto dílčím dotazu (povolujeme to, protože ORDER BY ... LIMIT ... změní výsledek, sadu řádků, nejen jejich pořadí).

Musíte ošetřit poddotaz v FROM klauzuli jako sadu řádků v nějakém nespecifikovaném a nedefinovaném pořadí a vložte ORDER BY na nejvyšší úrovni SELECT .

MariaDB tedy také doporučuje použít ORDER BY v nejvzdálenějším dotazu nebo LIMIT v případě potřeby.

Poznámka:V současné době nemám přístup ke správné MySQL 5.5 nebo 5.6, abych si ověřil, zda je tam chování stejné (a SQLFiddle.com nefunguje). Komentáře k původní zprávě o chybě (uzavřeno jako not-a-bug) naznačuje, že MySQL 5.6 se pravděpodobně chová stejně jako MariaDB.



  1. Vypočítejte rozdíl mezi 2 daty/časy v Oracle SQL

  2. Snadné nastavení webového serveru pomocí XAMPP

  3. Co je Microsoft Access? Stručný úvod pro nové uživatele

  4. Seznam všech cizích klíčů v tabulce na serveru SQL