2013-06-12 38 views
0

基本上我想從表中選擇基於另一個表的ID的數據。所以算法如下:PL/SQL循環

foreach i in (select distinct id from table1) 
{ 
    select * from table2 where table2.id=i; 
} 

如何使用SQL查詢執行此功能?我明白,我們可以使用連接等代替循環,但是,我的要求是,我需要僅在for循環中傳遞id。

+0

使用連接到兩個表,或子查詢數據從一個只得到數據。 –

+0

我的要求是,我必須一次只傳遞一個id。這是因爲表2的數據量非常大,只是使用WHERE子句,給出了臨時表空間錯誤。但是,如果我使用特定的ID查詢大量表,它會返回所需的值 – user1703096

+2

然後發佈您正在使用的查詢,執行計劃,表定義和** exact **錯誤消息。你不需要PL/SQL。一個普通的SQL查詢將會執行。 –

回答

1
select * from table2 where table2.id IN (select distinct id from table1) 
+0

我嘗試過使用IN,EXISTS。這些也給臨時表空間問題。如果我一次只能通過一個id,我將能夠得到結果 – user1703096

1

使用for而不是foreach

將PL/SQL爲begin .... end;塊(見下文的declare

=i應該讀=i.idi是SELECT語句的完整記錄,但你只能在它id領域感興趣。

在PL/SQL中,select語句必須被提取into一個變量。因此,您必須聲明一個相應的變量:r table1%rowtype

此類變量的聲明位於PL/SQL塊的declare ...部分。

的「算法」就變成

declare 
    r table2%rowtype; 
begin 
    for i in (select distinct id from table1) loop 
    select * into r from table2 where table2.id = i.id; 
    end loop; 
end; 
+0

感謝您的回覆。我嘗試使用上述查詢,但無法聲明table2。我通過DBLink訪問它。所以我寫了這樣的查詢: declare table2 [email protected]; r table2%rowtype; 開始 爲我in(從table1中選擇不同的id)循環 從table2中select * into r,其中table2.id = i.id; end loop; 結束; 這是給出的錯誤 – user1703096

+0

'declare r table2 @ dblink%rowtype;' –

+0

但是如何在select子句中使用這個table2。如何給這個別名? – user1703096