2012-08-07 121 views
0

我正在编写一个存储过程以查看两个表PersonTbl,UserTbl。首先在PersonTbl中搜索一个用户标识,如果用户标识在那里从UserTbl获得一个电子邮件地址并返回两者。但是,如果该ID不在那里,则搜索另外两个表(PersonsPendingTbl,UsersPendingTbl)作为ID和电子邮件。如果再次找到该ID,则返回null/nulls。到目前为止,这是我想到的,但不知道这是写它的最佳方式。让我知道是否有任何改变,你会建议;如果第一个结果为空,则查询其他表

create PROCEDURE [dbo].[MyNewSP] 
@ID VARCHAR(MAX) 
AS 
    DECLARE @userID VARCHAR(50) 
    DECLARE @Email VARCHAR(100) 
    DECLARE @currentlyActive CHAR 
    BEGIN 

    SELECT 
     @userID = userTbl.ID , 
     @Email = personTbl.EMAIL, 
     @currentlyActive = 'Y' 
    FROM 
     personTbl 
     INNER JOIN userTbl ON personTbl.person_id = userTbl.person_id 
    WHERE 
     (userTbl.ID = @ID) 


    IF (@userID != @ID) --Check to see if null 
     BEGIN 
      SELECT @currentlyActive = 'N' 

      SELECT 
       upt.ID , 
       ppt.EMAIL, 
       @currentlyActive 
      FROM 
       PersonsPendingTbl ppt 
       INNER JOIN dbo.UsersPendingTbl upt ON ppt.person_id = upt.person_id 
      WHERE 
       (upt.ID = @ID) 
     END 
    ELSE 
     BEGIN 
      SELECT 
       @userID , 
       @Email , 
       @currentlyActive 
     END 

END 
+0

的'CREATE PROCEDURE'缺少 – Yaroslav 2012-08-07 08:32:15

+0

更正缺少一行。 – windowskm 2012-08-07 08:52:42

回答

1

将两个结果合并,但始终选择第一行。如果用户注册为有效和无效的,它会返回一个有效:

Select * 
    from (
    SELECT userTbl.ID AS UID, personTbl.EMAIL as email, 'Y' as active 
     FROM personTbl 
     JOIN userTbl ON personTbl.person_id = userTbl.person_id 
     WHERE (userTbl.ID = @ID) 
    union all 
    SELECT upt.ID AS UID, ppt.EMAIL as email, 'N' as active 
     FROM PersonsPendingTbl ppt 
     INNER JOIN dbo.UsersPendingTbl upt ON ppt.person_id = upt.person_id 
     WHERE (upt.ID = @ID)) user 
    limit 0,1 
1

我不知道你的等待状态,非待定表之间的值的唯一性,但是这应该是足够接近,让你去。

select 
case 
    when p.PersonId is null and pp.personPendingId is null then null 
    else userid 
end as userid, 
case 
    when p.PersonId is not null then p.email 
    when p.PersonId is null and pp.PersonPendingID is not null then pp.email 
    else null 
end as email, 
case 
    when p.PersonId is not null then 'Y' 
    when p.PersonId is null and pp.PersonPendingID is not null then 'N' 
    else null 
end as CurrentlyActive 
from userTbl u 
left join PersonTbl p on u.Person_id = p.PersonId 
left join userPendingTbl up on u.UserId = up.UserPendingId 
left join PersonPendingTbl pp on up.personPendingId = pp.PersonPendingID 
where u.UserId = @ID 
相关问题