在 Access 中逆透视 SQL

Unpivot in Access SQL

大家好,我正在尝试在 MS Access 的 SQL 中使用 unpivot,我在网上找到了以下代码:

SELECT CustomerID, Phone
FROM
(
  SELECT CustomerID, Phone1, Phone2, Phone3 
  FROM dbo.CustomerPhones
) AS cp
UNPIVOT 
(
  Phone FOR Phones IN (Phone1, Phone2, Phone3)
) AS up;

来自该网页: https://www.mssqltips.com/sqlservertip/3000/use-sql-servers-unpivot-operator-to-help-normalize-output/

然而,当我在 Access 上尝试完全相同的代码时,它一直说 FROM 子句有错误。

我想知道这是否是因为访问语法与 SQL 服务器中的访问语法有些不同?如果有人能告诉我如何制作这段代码,我将不胜感激 运行.

只需使用union all:

SELECT CustomerID, Phone1 as Phone
FROM dbo.CustomerPhones
UNION ALL
SELECT CustomerID, Phone2 as Phone
FROM dbo.CustomerPhones
UNION ALL
SELECT CustomerID, Phone3 as Phone
FROM dbo.CustomerPhones;

如果您想承担删除重复项的开销,请使用 UNION

请记住,如果您真的是从实际数据库中读取数据,则可以通过使用直通而不是特定于访问的查询。您唯一失去的是设计器工具。我的意思是,您可以直接将查询按原样粘贴到 Access 中,并像使用任何其他 Access 查询一样使用它。

如果 table 已在 Access 中(与链接数据源分离)或不支持通过直通,这可能有效。这是相当蛮力的,但是如果您创建一个 table(在本例中称为 "Sequence"),其中包含一个名为 ID:

的字段
ID
1
2
3

然后你可以对你的手机进行交叉(笛卡尔)连接 table:

select
  p.[CustomerId],
  s.[ID],
  switch (
    s.[ID] = 1, p.[Phone1],
    s.[ID] = 2, p.[Phone2],
    s.[ID] = 3, p.[Phone3]
  ) as Phone
from
  [CustomerPhones] as p,
  [Sequence] as s

序列 table 可能有另一种解决方法...Postgresql 有一个名为 generate_series 的函数是完美的,但我不知道 Access 中的等效函数。