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

Jak mohu zabránit Postgresu vložit poddotaz?

Myslím, že OFFSET 0 je lepší přístup, protože je to zřejmější hack ukazující, že se děje něco divného, ​​a je nepravděpodobné, že někdy změníme chování optimalizátoru kolem OFFSET 0 ... kdežto doufejme, že CTE budou v určitém okamžiku inlineable CTE se staly v PostgreSQL 12 standardně inlineable. Následující vysvětlení je pro úplnost; použijte Seamusovu odpověď.

U nekorelovaných poddotazů můžete zneužít odmítnutí PostgreSQL 11 a starších vložit WITH výrazy dotazu a přeformulujte váš dotaz jako:

WITH t AS (
    SELECT * FROM tbl WHERE id IN ('6d48fc431d21', 'd9e659e756ad')
)
SELECT COUNT(*) 
FROM t 
WHERE data ? 'building_floorspace' 
AND data ?| ARRAY['elec_mean_monthly_use', 'gas_mean_monthly_use'];

To má téměř stejný účinek jako OFFSET 0 hack a jako offset 0 hack využívá vtípky v optimalizátoru Pg, které lidé používají k tomu, aby se vyhnuli nedostatku tipů dotazů Pg... tím, že je používají jako nápovědu k dotazu.

Ale OFFSET 0 hack je poněkud oficiálně požehnaný, protože zneužívání CTE již v PostgreSQL 12 nefunguje. (Jo!).



  1. Dávkové vložení/aktualizace MyBatis pro Oracle

  2. Snadná obnova databáze SQL – průvodce krok za krokem

  3. Jak povolit SQL Server Agent XP pomocí T-SQL

  4. Export dat dotazů SQL do Excelu