具有多个结果集的TSQL查询

具有多个结果集的TSQL查询,sql,sql-server,sql-server-2014,Sql,Sql Server,Sql Server 2014,我有3个表,其中ID可能在表1、表2、表3中,或者在表1和表3中 我需要做的是将ID作为参数传递给存储过程,然后检查3个表并返回一个结果集,其中ID位于3个表中的1个表中 如果在表1和表3中都找到了ID,我需要返回表3的结果集 并非所有表都包含相同数量的列。我似乎无法正确地构造这个 这是到目前为止我的存储过程: ALTER PROCEDURE [dbo].[Login] @userId varchar(20) AS BEGIN SET NOCOUNT ON; -- Customer Ser

我有3个表,其中ID可能在表1、表2、表3中,或者在表1和表3中

我需要做的是将ID作为参数传递给存储过程,然后检查3个表并返回一个结果集,其中ID位于3个表中的1个表中

如果在表1和表3中都找到了ID,我需要返回表3的结果集

并非所有表都包含相同数量的列。我似乎无法正确地构造这个

这是到目前为止我的存储过程:

ALTER PROCEDURE [dbo].[Login]

@userId varchar(20)

AS
BEGIN
SET NOCOUNT ON;

-- Customer Service User
IF EXISTS
               (
                   SELECT cs.id,
                                 first_name,
                                 last_name,
                                 logins.[email_address],
                                 logins.[password],
                                 phone,
                                 shift,
                                 manager,
                                 location
                   FROM customer_service cs
                   INNER JOIN logins ON cs.id = logins.[id]
                   WHERE cs.id = logins.[id]
                )

-- Marketing User
IF EXISTS
               (
                   SELECT mktg.id,
                                 first_name,
                                 last_name,
                                 logins.[email_address],
                                 logins.[password],
                                 phone,
                                 manager,
                                 location
                   FROM marketing mktg
                   INNER JOIN logins ON mktg.id = logins.[id]
                   WHERE mktg.id = logins.[id]
                )

-- Remote User
IF EXISTS
               (
                   SELECT ru.id,
                                 first_name,
                                 last_name,
                                 logins.[email_address],
                                 logins.[password],                                    
                                 manager,
                                 location
                   FROM remote ru
                   INNER JOIN logins ON ru.id = logins.[id]
                   WHERE ru.id = logins.[id]
                )

无论数据来自哪个表,您都希望存储的proc返回相同的列,因此我将
union
select语句放在一起,并对不在给定表中的列名使用
NULL
。由于您只想在第三个表中不存在id时从第一个表返回记录,因此我将其添加到第一个select的
where
子句中:

ALTER PROCEDURE [dbo].[Login]

@userId varchar(20)
AS BEGIN SET NOCOUNT ON;

-- Customer Service User
SELECT
    cs.id,
    first_name,
    last_name,
    logins.[email_address],
    logins.[password],
    phone,
    shift,
    manager,
    location
FROM customer_service cs
    INNER JOIN logins ON cs.id = logins.[id]
WHERE cs.id = @userId
    and not exists(select 1
                   from remote
                   where id = @userId)
union all
-- Marketing User
SELECT
    mktg.id,
    first_name,
    last_name,
    logins.[email_address],
    logins.[password],
    phone,
    null as shift,
    manager,
    location
FROM marketing mktg
    INNER JOIN logins ON mktg.id = logins.[id]
WHERE mktg.id = @userId
union all
-- Remote User
SELECT
    ru.id,
    first_name,
    last_name,
    logins.[email_address],
    logins.[password],   
    null as phone,
    null as shift,                                 
    manager,
    location
FROM remote ru
INNER JOIN logins ON ru.id = logins.[id]
WHERE ru.id = @userId

end