2010-11-09 9 views
2

Bonjour j'essaie de faire cette simple déclaration mais je veux ajouter une variable qui vient d'un select. Voici ce que j'ai.instruction de sélection PLSQL avec aide variable

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 

Dois-je utiliser quelque chose comme Declare et Begins? Je suis novice dans le domaine du SQL et j'ai de la difficulté à trouver des réponses.

Répondre

2

Si vous voulez faire dans SQL, vous voulez quelque chose comme

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) 

Probablement plus efficace serait quelque chose comme ce qui nous permet de frapper la table IPHONE_ALERTS juste une fois.

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

Vous avez besoin:

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; 

Modifier après commentaire:

Si select ne doit retourner qu'une seule ligne, vous n'avez pas besoin un curseur, mais vous avez besoin d'une clause into pour stocker chaque valeur récupérée dans une variable. Quelque chose comme:

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

Je ne suis pas sûr de savoir comment utiliser un curseur mais il ne devrait retourner qu'un seul résultat et c'est l'alerte la plus récente – Matt