嵌入子查询结果的最佳方法

时间:2012-03-15 07:43:18

标签: sql

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

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

现在这样做,如果查询A执行后有200行,我们调用查询B 200次来检索每个餐馆的评论信息。

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

UPDATE:

我在尝试在此问题之前尝试了JOIN,但问题是我每个餐厅只有一个评论,而不是每个餐厅的所有评论。我开始认为执行此操作的唯一方法是编写一个storedProcedure,其中一旦执行A,我将结果存储在#temp表中,遍历结果并检索每个餐馆的所有评论并插入它们回到#temp表,如果一个resturant有10个评论,它们将被分开;回到java中我会把它们分成一个有意义的格式。这样我仍然只为每个餐厅返回一行,但嵌入式评论作为列之一。

所以我会:

Resturnat,Location,Phone ......评论 X,悉尼,1234,...,AAAAAAA; BBBBBBBB; CCCCCCCCC;

评论?

2 个答案:

答案 0 :(得分:2)

在SQL中使用连接,这样就可以获得1个查询中的所有数据:

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

答案 1 :(得分:1)

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

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

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

    的操作

    来自@temp的SELECT *

    SELECT * FROM评论WHERE RestaurantPK IN(从@temp选择RestaurantPK)

  3. 虽然显然是按名称而不是*

    选择列