Оператор выбора PLSQL с помощью переменной - PullRequest
2 голосов
/ 09 ноября 2010

Здравствуйте, я пытаюсь сделать это простое утверждение, но я хочу добавить переменную, которая приходит из выбора.Вот что у меня есть.

 userEmail varChar(50) := SELECT user_id FROM users WHERE email = 'email@email.com';
        SELECT * 
        FROM iphone_alerts
        WHERE user_id =  userEmail
        AND date_added = (SELECT MAX(date_added) FROM iphone_alerts WHERE user_id = userEmail  

Нужно ли мне использовать что-то вроде объявления и начала?Я новичок в SQL и не могу найти ответы.

Ответы [ 3 ]

4 голосов
/ 09 ноября 2010

Вам нужно:

declare
    userEmail varchar2(200);
begin
    select user_id into userEmail
      from users
     where email = 'email@email.com';

    -- 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@email.com';

    -- 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;
2 голосов
/ 09 ноября 2010

Если вы хотите сделать это в SQL, вам нужно что-то вроде

SELECT alerts.*
  FROM iphone_alerts alerts,
       users 
 WHERE alerts.user_id = users.user_id
   AND users.email = 'email@email.com'
   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@email.com'
  )
 WHERE rnk = 1
0 голосов
/ 09 ноября 2010

Я не уверен, что вы пытаетесь сделать, но я думаю, что вам может понадобиться select into

declare 
    V_userID varChar(50) ;
begin
    /*This will store the value of the user_id field into the v_userID variable.*/
    SELECT user_id into v_userID FROM users WHERE email = 'email@email.com';
end;

http://download.oracle.com/docs/cd/B13789_01/appdev.101/b10807/13_elems045.htm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...