我有一张
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 语言有一个严格规则:在查看任何数据之前,您必须在查询编译时知道列数。
因此,如果您可以拥有一个人的任意数量的电话号码,那么在单个查询中这将是不可能,因为您必须查看数据才能知道您需要多少列。
相反,最佳选择是在客户端代码或报告工具中旋转数据。
替代方案:
使用
STRING_AGG()
或类似工具将电话号码汇总到单列中
限制为前N个合理的电话号码。这可以工作,但它需要为每个附加号码单独手动 JOIN 到电话表并手动指定列......也就是说,构建起来很尴尬并且运行很慢。
根据要求,通过三个单独的步骤在自己的列中显示所有电话号码:首先,运行查询以找出您需要多少个电话号码列。其次,使用第一步的结果动态构建新查询(使用上一个选项中缓慢且笨拙的多重连接技术)。最后,运行查询。