0

我正在编写一个存储过程来查看两个表 PersonTbl、UserTbl。首先在 PersonTbl 中搜索用户 ID,如果用户 ID 存在,则从 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
4

2 回答 2

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
于 2012-08-07T09:19:49.450 回答
1

合并两个结果,但始终选择第一行。如果用户注册为 Active AND Inactive,它将返回 Active 一个:

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
于 2012-08-07T09:32:38.840 回答