Alias table 这实际上是一个旋转的?

Alias table that's actually a pivoted one?

我有这个查询:

SELECT
    A.USERID 
    A.NAME
    PVT.PHONE 'PROBABLY A CASE STATEMENT ON NULL WILL GO HERE...
    PVT.ADDRESS 'ON HERE AS WELL...
FROM
    USERS A
    'I NEED TO CREATE A PIVOT TABLE HERE WITH THE ALIAS OF 'PVT' ON TABLE 'B'

B 内容:

 UserID  PHONE          ADDRESS      TYPE
 1       444-555-2222   XXXXXXX      PHONE
 1       XXXXXXX        66 Nowhere   NOTADDRESS 

如果 TYPE = 'PHONE'.

,我想在同一行上通过获取 B.PHONE 来获取用户的 phone

如果 TYPE = 'ADDRESS'.

,我还希望在同一行上通过获取 B.ADDRESS 内容来获取用户地址

正如您在上面的 table 转储中看到的那样,我 没有 有匹配 用户 ID 的记录并且类型 = 'ADDRESS'

所以我需要在主要 SELECT 中显示空白或 'No address',这将显示 phone,但在同一行,空白或 'No address' .

我不想创建 INNER JOIN,因为如果 B 中没有匹配的用户 ID,查询将不会 return 我在 table A 中为该用户提供的信息。

此外,LEFT JOIN 将创建两行,这是我不想要的。

我想我已将 table 转换为别名,但我不知道如何创建这样的别名。

有什么想法吗?

使用条件聚合怎么样?

SELECT A.USERID, A.NAME
       B.PHONE, B.ADDRESS
FROM USERS A LEFT JOIN
     (SELECT UserId, MAX(CASE WHEN TYPE = 'PHONE' THEN PHONE END) as PHONE,
             MAX(CASE WHEN TYPE = 'ADDRESS' THEN ADDRESS END) as ADDRESS
      FROM B
      GROUP BY UserId
     ) B
     ON B.UserId = A.UserId;

如果您使用 PIVOT,那么您需要子查询中的数据透视表并左连接到它

SELECT
    A.USERID,
    A.NAME,
    PVT.PHONE,
    PVT.[ADDRESS]
FROM
    Users A
    LEFT JOIN (SELECT *
                FROM 
                   (SELECT 
                        UserID, 
                        [Type],
                        (CASE [Type] WHEN 'PHONE' THEN PHONE WHEN 'ADDRESS' THEN [Address] END) Info 
                    FROM UserInfo) AS UI
                PIVOT (
                    MAX(Info)
                    FOR [Type] IN ([PHONE], [ADDRESS])
                ) P
    ) PVT ON A.UserID = PVT.UserID

这为您提供了与条件聚合查询几乎相同的执行计划,但看起来并不那么容易。

SQL Fiddle