【问题标题】:How to rollup multiple rows when Inner Joining two tables内部连接两个表时如何汇总多行
【发布时间】:2014-04-21 23:07:00
【问题描述】:

我被一个 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

对重复的餐厅条目进行分组的最简单方法是什么(我不需要从“review”表中输出任何数据,我只将它加入到“restaurant”表中以用于我网站上的搜索功能) ?

我需要“餐厅”表中的列数据(如上面的选择语句中定义),以便在我的网站上输出餐厅信息(作为餐厅列表)。例如

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

谢谢

【问题讨论】:

  • 请编辑您的问题并提供您想要获得的结果的示例。

标签: sql sql-server


【解决方案1】:

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

左外连接:

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);

【讨论】:

    【解决方案2】:

    编辑:如 cmets 所述,事实证明该表包含 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
    

    但是,真的,如果你能避免加入,你会更好。

    【讨论】:

    • 感谢您的回答。我已尝试按所有列名进行分组,但由于图像列(数据类型为图像),这不是一个可行的选项。 Group by 似乎不适用于这些类型的列。
    猜你喜欢
    • 2020-03-27
    • 2017-12-24
    • 2015-02-26
    • 2021-03-29
    • 1970-01-01
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多