首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >可以用一个查询获得两组数据吗?

可以用一个查询获得两组数据吗?
EN

Stack Overflow用户
提问于 2012-12-25 10:58:05
回答 3查看 116关注 0票数 4

我需要从数据库中获取一些条目,每个项目的前三项注释。

现在我有了两个存储过程GetAllItemsGetTopThreeeCommentsByItemId

在应用程序中,我得到100个条目,然后在foreach循环中调用GetTopThreeeCommentsByItemId过程来获得前三个注释。

我知道从性能的角度来看,这是不好的。

有什么技术允许用一个查询来获得这个结果吗?

我可以使用OUTER APPLY获得一个顶级评论(如果有的话),但我不知道如何得到三个。

代码语言:javascript
运行
复制
Items {ItemId, Title, Description, Price etc.}
Comments {CommentId, ItemId etc.}

我想得到的样本数据

  • Item_1 -- comment_1 -- comment_2 -- comment_3
  • Item_2 -- comment_4 -- comment_5
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-25 11:14:07

一种方法是在Server 2005和更新版本中使用CTE (公共表表达式)(在这方面还不够具体)。

使用此CTE,您可以根据某些条件(即ItemId )对数据进行分区,并让Server为每个“分区”从1开始对所有行进行编号,并按某些条件进行排序。

所以试着做这样的事情:

代码语言:javascript
运行
复制
;WITH ItemsAndComments AS
(
   SELECT 
       i.ItemId, i.Title, i.Description, i.Price,
       c.CommentId, c.CommentText,
       ROW_NUMBER() OVER(PARTITION BY i.ItemId ORDER BY c.CommentId) AS 'RowNum'
   FROM 
       dbo.Items i
   LEFT OUTER JOIN 
       dbo.Comments c ON c.ItemId = i.ItemId
   WHERE
      ......
)
SELECT 
   ItemId, Title, Description, Price,
   CommentId, CommentText
FROM 
   ItemsAndComments
WHERE
   RowNum <= 3

在这里,我为每个“分区”(即每个条目)选择最多三个条目(即注释)--由CommentId排序。

这接近你要找的东西吗??

票数 1
EN

Stack Overflow用户

发布于 2012-12-25 11:13:03

这得到两个哥哥使用外部应用:

代码语言:javascript
运行
复制
select m.*, elder.*
from Member m
outer apply
(
 select top 2 ElderBirthDate = x.BirthDate, ElderFirstname = x.Firstname
 from Member x 
 where x.BirthDate < m.BirthDate 
 order by x.BirthDate desc
) as elder
order by m.BirthDate, elder.ElderBirthDate desc

来源数据:

代码语言:javascript
运行
复制
create table Member
(
 Firstname varchar(20) not null, 
 Lastname varchar(20) not null,
 BirthDate date not null unique
);

insert into Member(Firstname,Lastname,Birthdate) values
('John','Lennon','Oct 9, 1940'),
('Paul','McCartney','June 8, 1942'),
('George','Harrison','February 25, 1943'),
('Ringo','Starr','July 7, 1940');

输出:

代码语言:javascript
运行
复制
Firstname            Lastname             BirthDate  ElderBirthDate ElderFirstname
-------------------- -------------------- ---------- -------------- --------------------
Ringo                Starr                1940-07-07 NULL           NULL
John                 Lennon               1940-10-09 1940-07-07     Ringo
Paul                 McCartney            1942-06-08 1940-10-09     John
Paul                 McCartney            1942-06-08 1940-07-07     Ringo
George               Harrison             1943-02-25 1942-06-08     Paul
George               Harrison             1943-02-25 1940-10-09     John

(6 row(s) affected)

现场测试:http://www.sqlfiddle.com/#!3/19a63/2

marc's answer更好,如果您需要向主实体查询“接近”实体(例如地理空间、长兄、最近的到期日等),只需使用外部应用即可。

外部应用演练:http://www.ienablemuch.com/2012/04/outer-apply-walkthrough.html

但是,您可能需要DENSE_RANK,而不是ROW_NUMBER/ yield,因为作为顶部的注释的标准可能会产生联系。前一名的产量可能超过一名,前三名的产量也可能超过三名。该场景的示例(DENSE_RANK演练):http://www.anicehumble.com/2012/03/postgresql-denserank.html

票数 0
EN

Stack Overflow用户

发布于 2012-12-25 11:15:49

您可以编写一个单独的存储过程,它调用GetAllItems和GetTopThreeeCommentsByItemId,在临时表中获取结果,并连接这些表以生成所需的单个结果集。

如果您没有机会使用存储过程,仍然可以通过从数据访问层运行单个SQL脚本来做到这一点,后者调用GetAllItems和GetTopThreeeCommentsByItemId,并将结果输入临时表并在稍后加入它们以返回单个结果集。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14029999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档