目前我有一个Web应用程序(JSF 2.0和SQL Server),其中使用查询A检索tDataTable的值,然后根据检索的结果运行另一个查询以检索相关的详细信息。
例如: 查询A:返回用户所选区域中的所有餐厅(假设有1000个) 查询B:根据返回结果(上图),查询B使用RestaurantPK值重试每个餐厅的评论。
现在这样做,如果查询A执行后有200行,我们调用查询B 200次来检索每个餐馆的评论信息。
所以我的问题是如何提高效率呢?这些案例的标准做法是什么?我选择标题为“嵌入子查询结果的最佳方法”,因为我怀疑在查询A中需要使用子查询,但无法弄清楚它是如何工作的,给定每个餐馆(行)可能存在10-15评论)。
我在尝试在此问题之前尝试了JOIN,但问题是我每个餐厅只有一个评论,而不是每个餐厅的所有评论。我开始认为执行此操作的唯一方法是编写一个storedProcedure,其中一旦执行A,我将结果存储在#temp表中,遍历结果并检索每个餐馆的所有评论并插入它们回到#temp表,如果一个resturant有10个评论,它们将被分开;回到java中我会把它们分成一个有意义的格式。这样我仍然只为每个餐厅返回一行,但嵌入式评论作为列之一。
所以我会:
Resturnat,Location,Phone ......评论 X,悉尼,1234,...,AAAAAAA; BBBBBBBB; CCCCCCCCC;
评论?
答案 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)
您尚未说明如何“显示”此数据,因此无法推荐绝对最佳方法。我想说你的两个选择是
返回所有评论的联接 - 餐厅信息将在每行中重复显示,因此在显示时您应该循环检查当前行的RestaurantPK是否与之前的行不同,然后只显示信息。
从SQL服务器返回2个表。将查询A的结果加载到@temp或#temp表中,然后执行类似
的操作来自@temp的SELECT *
SELECT * FROM评论WHERE RestaurantPK IN(从@temp选择RestaurantPK)
虽然显然是按名称而不是*
选择列