PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come posso impedire a Postgres di inserire una sottoquery?

Penso OFFSET 0 è l'approccio migliore poiché è più ovviamente un hack che mostra che sta succedendo qualcosa di strano ed è improbabile che cambieremo mai il comportamento dell'ottimizzatore attorno a OFFSET 0 ... mentre si spera che i CTE diventino inlineabili a un certo punto I CTE sono diventati inlineabili per impostazione predefinita in PostgreSQL 12. La seguente spiegazione è per completezza; usa la risposta di Seamus.

Per le sottoquery non correlate potresti sfruttare il rifiuto di PostgreSQL 11 e precedenti di inline WITH termini della query per riformulare la tua query come:

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'];

Questo ha più o meno lo stesso effetto di OFFSET 0 hack e come offset 0 hack sfrutta le stranezze nell'ottimizzatore di Pg che le persone usano per aggirare la mancanza di suggerimenti per le query di Pg ... usandoli come suggerimenti per le query.

Ma il OFFSET 0 hack è in qualche modo ufficialmente benedetto, mentre l'abuso di CTE non funziona più in PostgreSQL 12. (Sì!).