【问题标题】:Using multiple resultsets combined with joins in T-SQL在 T-SQL 中使用多个结果集并结合连接
【发布时间】:2011-06-27 20:41:50
【问题描述】:

我目前在我的存储过程中使用连接来从不同的表中输出元素。一个激进的例子

select a.*, b.*, c.*, d.*, e.*, f.* from tableA a
join tableB b on a.id = b.foreignid
join tableC c on b.id = c.foreignid
join tableD d on c.id = d.foreignid
join tableE e on d.id = e.foreignid
join tableF f on e.id = f.foreignid
where a.id = 1

在我的 C# 代码中将输出映射到实体时使用起来非常不方便,因为我必须维护大量样板代码。 相反,我会考虑使用多个结果集,以便可以将每个结果集映射到代码中的对象类型。 但是,当我的情况不同的结果都相互关联时,我将如何实现这一目标?我能够找到的示例都围绕着从不同的表中进行选择,这些表中的数据与我的外键无关。如果我要在多个结果集中输出我的结果,我唯一能想到的就是这样的

select a.* from tableA
where a.id = 1

select b.* from tableB
join tableA a on a.id = b.foreignid
where a.id = 1

select c.* from tableC
join tableB b on b.id = c.foreignid
join tableA on a.id = b.foreginid
where a.id = 1

select d.* from tableD
join tableC c on c.id = d.foreignid
join tableB b on b.id = c.foreignid
join tableA a on a.id = b.foreignid
where a.id = 1

select e.* from tableE
join tableD d on d.id = e.foreignid
join tableC c on c.id = d.foreignid
join tableB b on b.id = c.foreignid
join tableA a on a.id = b.foreignid
where a.id = 1    

select f.* from tableF
join tableE e on e.id = f.foreignid
join tableD d on d.id = e.foreignid
join tableC c on c.id = d.foreignid
join tableB b on b.id = c.foreignid
join tableA a on a.id = b.foreignid
where a.id = 1    

但这并不干净,效率低得多(我想,因为有更多的连接语句) 是否可以以我尝试的这种方式使用多个结果集?我只是不知道如何在存储过程中编写 sql 语句,而不必像示例中那样对每个结果集进行大量连接。使用当前的解决方案,我得到了大量的列,因为我将它们全部连接在一起

【问题讨论】:

    标签: tsql join multiple-resultsets


    【解决方案1】:

    您实际上可以从单个 SP 返回多个结果集并在 c# 中使用它们,例如查看此帖子:http://blogs.msdn.com/b/dditweb/archive/2008/05/06/linq-to-sql-and-multiple-result-sets-in-stored-procedures.aspx

    这是一个鲜为人知的功能,但听起来像您所要求的。您不必加入它们并将它们作为扁平行集返回,只需获取单独的行集并将它们拼凑在内存中即可。

    此外,您可能还想阅读 ORM 框架,如果它符合您的需求,这可以节省您在功能上花费的大量打字时间。 https://stackoverflow.com/questions/249550/what-orm-frameworks-for-net-do-you-like-best

    问候 GJ

    【讨论】:

    • 我知道如何在我的代码中使用多个结果集,如果可以的话,我会使用 ORM。但要求我们所有的数据库访问都使用存储过程。我确实使用 linq to sql 来使用我的存储过程,但这并没有给我 ORM 的全部功能。我的问题是,当我实际需要加入我的数据时,是否可以在存储过程中返回多个结果集
    • 我不确定我是否理解,您是否需要多个结果集,您的 SP 中有多个 selectt 语句。如果您需要加入,请加入。或者您是否想以一对多的方式将您从结果集中创建的对象链接在一起,就像在数据库中使用外键一样?
    • 更多关于您想要实现的目标和遇到的问题的示例代码会有所帮助。
    • 我添加了一个更好的例子,希望它更有意义
    • 好的,我明白了...您可以通过保留一个包含冗余信息的表来提高效率,每个键将表 e 链接到表 a。该表的 pk 将是 E_id,然后有其他列 D_id 到 A_id。在 A_id 上创建一个聚集索引。然后,您可以通过加入每个表而不是每个中间表来从每个表中提取相关部分。这需要一些内务处理才能使冗余信息保持最新,但它应该是最快的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多