Oracle
 sql >> Database >  >> RDS >> Oracle

Oracolo. Impedire la subquery di unione e le condizioni della query principale

ROWNUM è il modo più sicuro per prevenire le trasformazioni dell'ottimizzatore e garantire la sicurezza del tipo. Usando ROWNUM fa pensare a Oracle che l'ordine delle righe sia importante e previene cose come il push dei predicati e l'unione delle viste.

select *
from
(
   select id, value, rownum --Add ROWNUM for type safety.
   from eav
   where attr like 'sal%' 
)
where to_number(value) > 5000;

Ci sono altri modi per farlo, ma nessuno di questi è affidabile. Non preoccuparti di semplici viste inline, espressioni di tabelle comuni, CASE , ordinamento dei predicati o suggerimenti. Questi metodi comuni non sono affidabili e li ho visti fallire tutti.

La migliore soluzione a lungo termine è modificare la tabella EAV per avere una colonna diversa per ogni tipo, come descrivo in questa risposta . Risolvi questo problema ora o futuri sviluppatori malediranno il tuo nome quando dovranno scrivere query complesse per evitare errori di digitazione.