Normalt skulle du bara gå med i de två borden.
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
Eftersom du är orolig för effektivitet, dock
- Är
TEMP_TABLE
verkligen ett tillfälligt bord? Om så är fallet, varför? Det är ytterst sällsynt att Oracle faktiskt behöver använda temporära tabeller så det får mig att misstänka att du förmodligen gör något ineffektivt för att fylla i den temporära tabellen i första hand. - Varför har du en markör
FOR
loop för att bearbeta data frånTEMP_TABLE
? Rad-för-rad-bearbetning är det långsammaste sättet att göra något i PL/SQL så det skulle i allmänhet undvikas om du är orolig för effektivitet. Ur prestandasynpunkt vill du maximera SQL så att istället för att göra en slinga som gjorde en rad enradsINSERT
ellerUPDATE
operationer skulle du göra en endaINSERT
ellerUPDATE
som modifierade en hel uppsättning rader. Om du verkligen behöver bearbeta data i bitar, är det där PL/SQL-samlingar och bulkbearbetning kommer att spela in, men det kommer inte att vara lika effektivt som rak SQL. - Varför har du
DISTINCT
i din fråga motTEMP_TABLE
? Förväntar du dig verkligen att det kommer att finnas dubbletter avbig_id
värderingar som inte är felaktiga? För det mesta använder folkDISTINCT
felaktigt antingen för att dölja problem där data har sammanfogats felaktigt eller där du tvingar Oracle att göra en dyr sortering ifall felaktig data skapas i framtiden när en begränsning skulle vara det lämpligaste sättet att skydda dig själv.