sql - 将三行(包含空值)的数据合并为一行

标签 sql sql-server t-sql

我有三个表:

Profile
  -ProfileID
  -FirstName
  -LastName

ProfilePhoneNumber
  -ProfileID
  -PhoneNumberID

PhoneNumber
  -PhoneNumberID
  -PhoneNumberTypeID
  -Number

ProfilePhoneNumberProfilePhoneNumber 之间的简单桥接表。

我想查询特定的电话号码类型并返回一行。我希望能够接受 null 值,因为并非所有人都会拥有所有类型的电话号码。

这是我当前的查询:

SELECT
      p.FirstName
    , p.LastName
    , bpn.Number as BusinessPhoneNumber
    , mpn.Number as MobilePhoneNumber
FROM Profile p
LEFT JOIN ProfilePhoneNumber ppn ON p.ProfileID = ppn.ProfileID
LEFT JOIN PhoneNumber bpn ON ppn.PhoneNumberID = bpn.PhoneNumberID AND bpn.PhoneNumberTypeID = '1'
LEFT JOIN PhoneNumber mpn ON ppn.PhoneNumberID = mpn.PhoneNumberID AND mpn.PhoneNumberTypeID = '2'
WHERE p.ProfileID = '123'

这始终有效,但会返回三行,因为配置文件 123 具有三个电话号码,因此查询会为每个电话号码返回一行。

如果我将其更改为 PhoneNumber 上的 INNER JOIN,我只能返回一行,但仅限于正在查询的配置文件具有所有 PhoneNumberTypeID 我正在查询的类型。

如何返回允许空值的一行?

最佳答案

如果您提供一些数据样本和预期输出,我稍后会更新查询。

到目前为止,这会有帮助吗?

SELECT
      p.FirstName
    , p.LastName
    , Max(bpn.Number) as BusinessPhoneNumber
    , Max(mpn.Number) as MobilePhoneNumber

FROM Profile p
    LEFT JOIN ProfilePhoneNumber ppn on p.ProfileID = ppn.ProfileID
        LEFT JOIN PhoneNumber bpn on ppn.PhoneNumberID 
         = bpn.PhoneNumberID AND bpn.PhoneNumberTypeID = '1'
        LEFT JOIN PhoneNumber mpn on ppn.PhoneNumberID 
         = mpn.PhoneNumberID AND mpn.PhoneNumberTypeID = '2'

WHERE p.ProfileID = '123'
group by p.FirstName, p.LastName;

关于sql - 将三行(包含空值)的数据合并为一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31687388/

相关文章:

mysql - 理解模逻辑

php - 显示特定用户的 SQL 表数据

sql-server - 如何删除字符串上的重音符号?

sql - 通过完整外连接查找多个字段的最小日期

sql-server - T-SQL First_Value() - 它如何返回多个值?

php - SQL JOIN 与 CakePHP

sql - 在 SQL 中存储当天的时间

c# - 当我从下拉列表中选择一个值来解决网格中的值时,它会覆盖它

sql - 在一个 SELECT 语句中设置两个标量变量?

sql - 优化 not in to left outer join