SQL 从两个表中选择数据(一行 -> 多行)

Posted

技术标签:

【中文标题】SQL 从两个表中选择数据(一行 -> 多行)【英文标题】:SQL Select data from two tables (one row -> multiple rows) 【发布时间】:2010-12-09 14:50:18 【问题描述】:

假设我有两个 SQL 表:Customers 和 PhoneNumbers。

假设客户具有以下列:customerId(主键)、fName、lName。

假设 PhoneNumbers 具有以下列:phoneNumberId(主键)、phoneNumber、customerId(外键)。

目前我的理解是,如果每个客户都有一个电话号码,我可以用下面的 SQL 选择每个客户的 fName、lName 和 phoneNumber:

SELECT 
    customer.fName, customer.lName, phone.phoneNumber 
FROM 
    Customers customer 
        INNER JOIN phoneNumbers phone ON 
            customer.customerId = phone.customerId

如果客户可能有多个电话号码怎么办?如何获取包含每个客户电话号码列表的客户列表?

我驱动 SQL 的编程语言是 C#/.NET。

【问题讨论】:

@casperOne,感谢您格式化我的代码 :-) logiclabz.com/sql-server/… 【参考方案1】:

如您所说,如果每个客户只有一个电话号码,您的查询将有效。

具有多个电话号码的客户也将被退回,但客户记录将针对每个不同的电话号码重复。

您需要考虑的另一个条件是没有电话号码的客户。如果您对表进行 INNER JOIN,那么这些客户将被排除在结果集中。要包含此类客户,您需要使用 OUTER JOIN。

【讨论】:

【参考方案2】:

您提供的查询将返回多个电话号码(如果存在)。您会看到带有 customer.fNamecustomer.lName 的行重复出现,每行带有不同的 phone.phoneNumber

【讨论】:

【参考方案3】:

你可以做同样的事情。您当前列出的查询应该检索您想要的确切结果;每个客户每个电话号码一行。

【讨论】:

【参考方案4】:

如果一位客户有多个号码,您将获得多行数据。

【讨论】:

以上是关于SQL 从两个表中选择数据(一行 -> 多行)的主要内容,如果未能解决你的问题,请参考以下文章

SQL INNER JOIN - 根据另一行的值从另一个表中选择数据

sql 一行拆多行

sql 将多行显示为一行,如果一张表中有几行数据中的同一列的值是相同,那么只显示为一行的数据

使用选择插入多行

SQL Server将一列的多行内容拼接成一行的实现方法

SQL Server将一列的多行内容拼接成一行