用于选择客户记录和与其关联的每个电话号码的 SQL 语句

问题描述 投票:0回答:1

我有一张

Customers
桌子和一张
CustomerPhones
桌子。
Customers
表具有列
ID, FirstName, Lastname
。电话号码表有
CustomerID, PhoneNumber, PhoneType

假设我在

Customers
表中有以下数据:

ID   Firstname  Lastname
------------------------
1    Bob        Smith

然后在电话号码表中

Customerid   PhoneNumber     PhoneType
--------------------------------------
    1        111111111          H
    1        222222222          C
    1        333333333          C

如果我使用简单的 JOIN SQL,我将得到 3 行:

SELECT
    c.id, c.FirstName, c.LastName, P.PhoneNumber, P.Phonetype 
FROM
    Customers c
JOIN
    CustomerPhoneNumbers P ON p.customerid = c.id

结果:

ID   Firstname   Lastname   phonenumber    phonetype
--------------------------------------------------
1    Bob         Smith      111111111       H
1    Bob         Smith      222222222       C
1    Bob         Smith      333333333       C

如何将其转换为 1 行但每个数字的结果?

ID  Firstname   Lastname    phonenumber phonetype   phonenumber phonetype   phonenumber phonetype
---------------------------------------------------------------------------------------------------
1       Bob         Smith       111111111   H             222222222 C           333333333   C

它是否可以是动态的,因为客户可以拥有任意数量的电话号码?感谢您的时间和帮助。

sql
1个回答
0
投票

SQL 语言有一个严格规则:在查看任何数据之前,您必须在查询编译时知道列数。

因此,如果您可以拥有一个人的任意数量的电话号码,那么在单个查询中这将是不可能,因为您必须查看数据才能知道您需要多少列。

相反,最佳选择是在客户端代码或报告工具中旋转数据。

替代方案:

  1. 使用

    STRING_AGG()
    或类似工具将电话号码汇总到单列中

  2. 限制为前N个合理的电话号码。这可以工作,但它需要为每个附加号码单独手动 JOIN 到电话表并手动指定列......也就是说,构建起来很尴尬并且运行很慢。

  3. 根据要求,通过三个单独的步骤在自己的列中显示所有电话号码:首先,运行查询以找出您需要多少个电话号码列。其次,使用第一步的结果动态构建新查询(使用上一个选项中缓慢且笨拙的多重连接技术)。最后,运行查询。

© www.soinside.com 2019 - 2024. All rights reserved.