2010-11-09 85 views
2

你好我正在嘗試做這個簡單的語句,但我想添加一個來自select的變量。這是我的。帶可變幫助的PLSQL select語句

userEmail varChar(50) := SELECT user_id FROM users WHERE email = '[email protected]'; 
     SELECT * 
     FROM iphone_alerts 
     WHERE user_id = userEmail 
     AND date_added = (SELECT MAX(date_added) FROM iphone_alerts WHERE user_id = userEmail 

我是否需要沿着Declare和Begins的方向使用某些東西?我是新來的SQL的東西,並無法找到答案。

回答

2

如果你想這樣做在SQL中,你想要的東西像

SELECT alerts.* 
    FROM iphone_alerts alerts, 
     users 
WHERE alerts.user_id = users.user_id 
    AND users.email = '[email protected]' 
    AND alerts.date_added = (SELECT MAX(date_added) 
           FROM iphone_alerts alerts2 
          WHERE alerts2.user_id = user.user_id) 

也許更有效的將是這樣的,讓我們打IPHONE_ALERTS表一次。

SELECT <<list of columns in IPHONE_ALERTS>> 
    FROM (
    SELECT alerts.*, 
      RANK() OVER (PARTITION BY alerts.user_id ORDER BY date_added DESC) rnk 
     FROM iphone_alerts alerts, 
      users 
    WHERE alerts.user_id = users.user_id 
     AND users.email = '[email protected]' 
) 
WHERE rnk = 1 
4

您需要:

declare 
    userEmail varchar2(200); 
begin 
    select user_id into userEmail 
     from users 
    where email = '[email protected]'; 

    -- you will need a cursor to itare these results 
    select * 
     from iphone_alerts 
    where user_id = userEmail 
     and date_added = (select max(date_added) from iphone_alerts WHERE user_id); 

end; 

編輯點評後:

如果select只返回一行,則不需要一個遊標,但您需要一個into子句將每個檢索到的值存儲到一個變量中。喜歡的東西:

declare 
    userEmail varchar2(200); 
    v_field1 number; 
    v_field2 date; 
    v_field3 varchar2(200); 
begin 
    select user_id into userEmail 
     from users 
    where email = '[email protected]'; 

    -- you will need a cursor to itare these results 
    select field1, field2, field3 
     into v_field1, v_field2, v_field3 
     from iphone_alerts 
    where user_id = userEmail 
     and date_added = (select max(date_added) from iphone_alerts WHERE user_id); 

end; 
+0

我不確定如何使用遊標,但它應該只返回一個結果,這是最近的警報 – Matt 2010-11-09 18:20:21