SQL-如何在没有循环的情况下为表的表运行SELECT

SQL-如何在没有循环的情况下为表的表运行SELECT,sql,select,Sql,Select,我有以下表格: People: ID, Name, address, etc. 及 基本上,人与电话之间的关系是1:N 我需要得到一个子类别中所有人的电话号码列表。例如,我想: Bob, 555-1234, programmer Bob, 555-2222, programmer John, 555-2322, SQL expert ... 简单的解决方案是进行循环,以便: SELECT ID, name, ... FROM people WHERE subcategory IN (1, 5

我有以下表格:

People:
ID, Name, address, etc.

基本上,
人与电话之间的关系是1:N

我需要得到一个子类别中所有人的电话号码列表。例如,我想:

Bob, 555-1234, programmer
Bob, 555-2222, programmer
John, 555-2322, SQL expert
...
简单的解决方案是进行循环,以便:

SELECT ID, name, ... FROM people WHERE subcategory IN (1, 5, 9, ...);
然后我可以做一个循环:

for(eachPerson)
  SELECT phoneNumber FROM phone WHERE people.ID = eachPerson.ID
然后合并所有数据。但那真的很糟糕

或者,我可以执行
左JOIN
,并包含一个
分组的子句,这将把所有数据推到一个大型表中。我担心的是,虽然这应该更有效,但结果集将包含大量重复和无用的数据。有没有更好的办法,或者这是我唯一的选择


我也仅限于ANSI-SQL。

仅当您希望TableA中的行在TableB中没有行时才使用
左联接
,否则,请坚持使用常规的
内部联接
。为什么你认为你需要一个
分组人
?你想要所有的电话号码,对吗?一个
JOIN
将(几乎可以肯定)比无数次循环中的db更有效-优化器是你的朋友,不要试图破坏它。不过,您可能需要在连接语句上添加一个ORDER BY,以确保一个人的所有记录都列在一起;你是说示例中重复的“Bob”吗?你说“我想要”的。请澄清。@Clockwork Muse我不想要内部连接,因为子类别中的某个人可能没有电话号码。在这种情况下,我们仍然希望包括它们。你对分组方式的看法是对的,我最终在多个站点上进行了排序columns@DourHighArch对这个例子有点太简单了,但想象一下,这些数据不仅包括此人的姓名,还包括他们的地址等。基本上,对于他们拥有的每个电话号码,至少还有10列额外的数据被复制了好几次。同样在上面的例子中,大多数人通常会有1-2个电话号码,但在我的真实数据库中,平均值要高得多,相当于100个电话是相当标准的(在我的真实数据库中,我们处理的是其他类型的数据集)。我需要从手机上抓取不止一列……如果你打算从循环中的多个表中抓取,那么在db中这样做肯定会更有效率。但是,最终的问题是,如果有多个表具有多行,那么您将得到笛卡尔乘积的多个“副本”。您说您仅限于ANSI SQL—访问此数据的应用程序如何?使用ORM是一种选择吗?这将有点抽象这一部分;有些行将通过连接获得,有些行作为单独的循环。
for(eachPerson)
  SELECT phoneNumber FROM phone WHERE people.ID = eachPerson.ID