【问题标题】:Best approach to embed subquery results嵌入子查询结果的最佳方法
【发布时间】:2012-03-15 18:44:18
【问题描述】:

目前我有一个 Web 应用程序(JSF 2.0 和 SQL Server),其中 tDataTable 的值是使用查询 A 检索的,然后根据检索到的结果,我们运行另一个查询来检索相关的详细信息。

例如: 查询 A:返回用户选择区域中的所有餐厅(假设有 1000 家) 查询 B:根据返回的结果(上图),查询 B 使用 RestaurantPK 值重试每家餐厅的评论。

所以现在的做法是,如果查询 A 执行后有 200 行,我们调用查询 B 200 次来检索每家餐厅的评论信息。

所以我的问题是如何提高效率?在这些情况下,标准做法是什么?我选择标题为“嵌入子查询结果的最佳方法”,因为我怀疑子查询将需要在 Query A 中使用,但无法弄清楚它是如何工作的,给定每个餐厅(行)可能有10-15 条评论)。

更新:

在将问题发布到此处之前,我曾尝试加入,但问题是我只获得了每家餐厅的一条评论,而不是每家餐厅的所有可用评论。我开始认为这样做的唯一方法是编写一个存储过程,一旦执行 A,我会将结果存储在 #temp 表中,循环遍历结果并检索每个餐厅的所有评论并插入它们回到 #temp 表,如果一个餐厅有 10 条评论,它们将用 ; 分隔。回到java中,我会将它们拆分回有意义的格式。这样,我仍然只为每家餐厅返回一行,但将嵌入的评论作为列之一。

所以我会:

Returnat,位置,电话......评论 X,悉尼,1234,.....,AAAAAAA;BBBBBBBB;CCCCCCCCC;

评论?

【问题讨论】:

    标签: sql


    【解决方案1】:

    在 SQL 中使用连接,因此您可以在 1 个查询中获取所有数据。:

    Select rest.id, reviews.text 
    from restaurants rest
    inner join reviews on reviews.rest_id = rest.id
    where some conditions for restaurants
    

    【讨论】:

    • 感谢您的回复 - 可以查看我更新的问题和评论吗?
    【解决方案2】:

    您尚未说明如何“显示”这些数据,因此无法推荐绝对最佳的方法。我会说你的 2 个选项是

    1. 一个返回所有评论的连接 - 餐厅信息将为每一行重复,因此在显示时您应该循环检查当前行的 RestaurantPK 是否与前一个不同,然后只显示信息。

    2. 从 SQL 服务器返回 2 个表。将查询 A 的结果加载到 @temp 或 #temp 表中,然后执行类似

      的操作

      从@temp中选择*

      SELECT * FROM reviews WHERE RestaurantPK IN (SELECT RestaurantPK from @temp)

    虽然显然是按名称而不是 * 选择列

    【讨论】:

    • 谢谢,我将采用这种方法,在存储过程中选择 2 个 SQL ......绝对是对我们使用的宝贵方法的改进
    猜你喜欢
    • 1970-01-01
    • 2013-08-25
    • 2019-07-15
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 2014-01-28
    相关资源
    最近更新 更多