sql - 具有多个结果集的 TSQL 查询

标签 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 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]
                )

最佳答案

无论数据来自哪个表,您都希望存储过程返回相同的列,所以我会 union选择语句一起使用 NULL对于不在给定表中的列名。由于您只想在第三个表中不存在 id 时返回第一个表中的记录,因此我将其添加到第一个选择的 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

关于sql - 具有多个结果集的 TSQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40895314/

相关文章:

sql - 如何在 T-SQL 中按一列分组并按另一列排序

MySQL 子查询优化与共享子查询

sql - 存储过程中动态形成的 SQL 是否否定了存储过程的真正目的?

sql-server - SQL Server 2012 中的 VLOOKUP 样式查找

sql-server - 如何通过 IIS 启动 SQL Server LocalDB

sql-server - SQL Server : view MUCH slower than same query by itself

mysql - 创建触发器以影响特定行

sql - 实现向数据库角色授予对数据库中所有用户表的权限的 SQL 脚本的最佳方法是什么?

mysql - 将字符添加到sql中的字符串

sql-server - 如何在 Microsoft SQL Server 2014 中创建本地数据库?