Normaal gesproken zou je gewoon aan de twee tafels deelnemen.
FOR some_cursor IN (SELECT s.col1,
s.col2
FROM sometable s
JOIN temp_table t ON (s.col3 = t.col1))
LOOP
<<do something>>
END LOOP
Omdat u zich echter zorgen maakt over efficiëntie
- Is
TEMP_TABLE
echt een tijdelijke tafel? Zo ja, waarom? Het is buitengewoon zeldzaam dat Oracle tijdelijke tabellen moet gebruiken, dus dat doet me vermoeden dat u waarschijnlijk iets inefficiënts doet om de tijdelijke tabel in de eerste plaats te vullen. - Waarom heb je een cursor
FOR
lus om de gegevens vanTEMP_TABLE
. te verwerken ? Rij-voor-rij verwerking is de langzaamste manier om iets te doen in PL/SQL, dus het zou over het algemeen worden vermeden als u zich zorgen maakt over efficiëntie. Vanuit het oogpunt van prestaties wilt u SQL maximaliseren, zodat in plaats van een lus te maken die een reeksINSERT
met één rij deed ofUPDATE
bewerkingen, zou u een enkeleINSERT
ofUPDATE
die een hele reeks rijen heeft gewijzigd. Als je gegevens echt in brokken moet verwerken, dan komen daar PL/SQL-verzamelingen en bulkverwerking om de hoek kijken, maar dat zal niet zo efficiënt zijn als gewone SQL. - Waarom heb je de
DISTINCT
in uw zoekopdracht tegenTEMP_TABLE
? Verwacht je echt dat er dubbelebig_id
. zullen zijn? waarden die niet fout zijn? Meestal gebruiken mensenDISTINCT
ofwel om problemen te verdoezelen waarbij gegevens onjuist zijn samengevoegd of waarbij u Oracle dwingt een dure sortering uit te voeren voor het geval er in de toekomst onjuiste gegevens worden gemaakt wanneer een beperking de meest geschikte manier zou zijn om uzelf te beschermen.