sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur kan jag förhindra att Postgres infogar en underfråga?

Jag tror att OFFSET 0 är det bättre tillvägagångssättet eftersom det mer uppenbart är ett hack som visar att något konstigt pågår, och det är osannolikt att vi någonsin kommer att ändra optimerarens beteende kring OFFSET 0 ... medan förhoppningsvis CTE:er kommer att bli inlineable någon gång CTE:er blev inlineable som standard i PostgreSQL 12. Följande förklaring är för fullständighetens skull; använd Seamus svar.

För okorrelerade underfrågor kan du utnyttja PostgreSQL 11 och äldres vägran att infoga WITH söktermer för att omformulera din fråga som:

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

Detta har ungefär samma effekt som OFFSET 0 hacka och gilla offset 0 hack utnyttjar egenheter i Pgs optimerare som människor använder för att komma runt Pgs brist på frågetips ... genom att använda dem som frågetips.

Men OFFSET 0 hack är något officiellt välsignat, medan CTE-missbruk inte längre fungerar i PostgreSQL 12. (Yay!).



  1. Så här fixar du "profilnamnet är inte giltigt" när du uppdaterar en e-postprofil för databas i SQL Server (T-SQL)

  2. Vad är standardnamnet för begränsningar i MySQL?

  3. Hur man ändrar användare till superanvändare i PostgreSQL

  4. Hur avslutar jag ett skript i SQLPlus när ett fel uppstår och återgår till SQLPlus-prompten, utan att koppla bort eller avsluta SQLPlus?