内部连接两个表时如何汇总多行

时间:2014-04-21 13:53:35

标签: sql sql-server

我遇到了一个SQL命令,我加入了两个表。我有两张桌子:一家餐馆'表和评论'表。这个关系是一家餐馆的很多评论。加入桌子后,我对每家餐厅都有很多评论,因此我最终为每家餐厅提供了许多复制品。我需要的是将重复的餐馆行分组,以便在我实施的搜索结果中一次输出一个餐馆。到目前为止的代码是:

SELECT a.Restaurant_Id, a.Restaurant_Name, a.Restaurant_Location, 
   a.Restaurant_Image, a.Restaurant_Thumbnail, a.Restaurant_Owner, a.Restaurant_Description
FROM restaurant a INNER JOIN review b 
  ON a.Restaurant_Id=b.Restaurant_Id

对复制的餐厅条目进行分组的最简单方法是什么(我不需要从“评论”表中输出任何数据,我只是将其加入了'餐厅& #39;我网站上的搜索功能表?)

我需要来自'餐厅的列数据。 table(在上面的select语句中定义),以便在我的网站上输出餐馆信息(作为餐馆列表)。 e.g。

Id  Name           Location    Image   Thumbnail   Owner   Description
-------------------------------------------------------------------------------  
10  Red Lion       Manchester                       8       A description...

由于

2 个答案:

答案 0 :(得分:1)

您似乎只想确保餐厅至少有一次评论才能列出。您可以使用LEFT OUTER JOINWHERE EXISTS来完成此要求。

LEFT OUTER JOIN:

SELECT DISTINCT a.Restaurant_Id, a.Restaurant_Name, a.Restaurant_Location, 
   a.Restaurant_Image, a.Restaurant_Thumbnail, a.Restaurant_Owner, a.Restaurant_Description
FROM restaurant a LEFT OUTER JOIN review b 
  ON a.Restaurant_Id=b.Restaurant_Id
WHERE b.Restaurant_Id IS NOT NULL;

在哪里存放:

SELECT a.Restaurant_Id, a.Restaurant_Name, a.Restaurant_Location, 
   a.Restaurant_Image, a.Restaurant_Thumbnail, a.Restaurant_Owner, a.Restaurant_Description
FROM restaurant a 
WHERE EXISTS
(SELECT b.Restaurant_Id
FROM review b 
WHERE a.Restaurant_Id=b.Restaurant_Id);

答案 1 :(得分:0)

编辑:如评论中所述,事实证明该表包含IMAGE数据,因此无法比较。这意味着GROUP BY和DISTINCT都会失败。我会把它留下来,因为它可能会让它在某些时候对其他人显而易见。


可以按要返回的所有字段进行分组。

SELECT a.Restaurant_Id, a.Restaurant_Name, a.Restaurant_Location, 
   a.Restaurant_Image, a.Restaurant_Thumbnail, a.Restaurant_Owner, a.Restaurant_Description
FROM restaurant a INNER JOIN review b 
  ON a.Restaurant_Id=b.Restaurant_Id
GROUP BY a.Restaurant_Id, a.Restaurant_Name, a.Restaurant_Location, 
   a.Restaurant_Image, a.Restaurant_Thumbnail, a.Restaurant_Owner, a.Restaurant_Description

与对它们进行DISTINCT相同但速度更快。

SELECT DISTINCT a.Restaurant_Id, a.Restaurant_Name, a.Restaurant_Location, 
   a.Restaurant_Image, a.Restaurant_Thumbnail, a.Restaurant_Owner, a.Restaurant_Description
FROM restaurant a INNER JOIN review b 
  ON a.Restaurant_Id=b.Restaurant_Id

但是,实际上,如果你可以避免加入,那你就更好了。