【问题标题】:Filter by a persons name only仅按人名过滤
【发布时间】:2020-06-14 08:40:15
【问题描述】:

我正在尝试过滤我的结果以仅显示住在特定城市酒店的人的姓名。到目前为止我所拥有的是

select guestName
from Guest
join Hotels on hotelNo=1

但是,当我这样做时,结果页面会列出数据库中的每个客人姓名,而不是留在hotelNo 1 中的客人姓名。

【问题讨论】:

标签: sql sql-server join where-clause


【解决方案1】:

您应该将您的条件放在Where 子句中。

Join 应该是这样的

select guestName
from Guest g
join Hotels h on g.HotelId = h.HotelId -- Primary Key of Hotels equals Foreign Key of Guest 
where hotelNo = 1

说明

Join子句中,你应该解决两个表之间的条件(通常在主键(Hotel表)和外键(Guest表)之间)

更多详情https://www.w3schools.com/sql/sql_join_inner.asp

【讨论】:

  • 正确答案!连接的重要一点是您确保首先连接列: g.HotelId = h.HotelId 之后,您将获得与连接匹配的结果摘要。之后您可以使用 where 语句进行过滤
  • 感谢您的解释,我能够匹配记录。它也比课堂教科书更有用。
  • @howimetmyself & Phong 问题不在于 vs where 而是缺少的条件。 PS该图的图例是什么?我们如何阅读它?如果是维恩图,集合和元素的种类是什么?圆圈、标签和阴影是什么?那个人到底说了什么?特别是因为 SQL 表是包而不是集合。那些维恩图具有误导性且无益。 CROSS JOIN vs INNER JOIN in SQL Venn Diagram for Natural Join PS那个链接的网站资源很差。
  • 不,@philipxy。如您所见,OP 使用的是join Hotels on hotelNo=1。所以条件不应该放在Join clause --> 应该放在Where 子句上。
  • 不,没关系。这是非常基本的。阅读我提供的第一个链接。 (尽管我将其用于类似维恩图的部分。)问题中的代码返回太多行,因为它不限于相等的 id,但它应该像您的代码一样。但是当没有外部连接时,条件可以以任何方式分布在 on 和 where 之间。
猜你喜欢
  • 2015-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-13
  • 1970-01-01
  • 2012-04-02
相关资源
最近更新 更多