Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Orakel. Unterabfrage- und Hauptabfragebedingungen zusammenführen verhindern

ROWNUM ist der sicherste Weg, Optimierertransformationen zu verhindern und Typsicherheit zu gewährleisten. Mit ROWNUM lässt Oracle glauben, dass die Zeilenreihenfolge wichtig ist, und verhindert Dinge wie das Pushen von Prädikaten und das Zusammenführen von Ansichten.

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

Es gibt andere Möglichkeiten, dies zu tun, aber keine davon ist zuverlässig. Kümmern Sie sich nicht um einfache Inline-Ansichten, allgemeine Tabellenausdrücke, CASE , Prädikatreihenfolge oder Hinweise. Diese gängigen Methoden sind nicht zuverlässig und ich habe sie alle versagen sehen.

Die beste langfristige Lösung besteht darin, die EAV-Tabelle so zu ändern, dass für jeden Typ eine andere Spalte vorhanden ist, wie ich in diese Antwort . Beheben Sie dies jetzt oder zukünftige Entwickler werden Ihren Namen verfluchen, wenn sie komplexe Abfragen schreiben müssen, um Tippfehler zu vermeiden.