accesssql中的Unpivot

accesssql中的Unpivot,sql,ms-access,unpivot,Sql,Ms Access,Unpivot,大家好,我正在尝试在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; 从本网页: 然而,当我在Access上尝试完

大家好,我正在尝试在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;
从本网页:

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


我想知道这是否是因为access的语法与SQL server中的不同?如果有人能告诉我如何运行此代码,我将不胜感激。

只需使用
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

请记住,如果您确实从实际数据库中读取数据,则可以通过使用传递而不是特定于访问的查询来使用所有特定于RDMBS的功能(在本例中为MS SQL Server)。你唯一失去的就是设计器工具。我想说的是,您可以按原样将查询粘贴到Access中,并像其他Access查询一样使用它

如果该表已经处于访问状态(与链接的数据源分离)或不支持通过传递,则这可能会起作用。这是一个非常暴力的行为,但是如果您创建一个表(在本例中称之为“序列”),其中包含一个名为ID的字段:

ID
1
2
3
然后,您可以对电话表执行交叉(笛卡尔)连接:

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

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

Access没有内置的
UNPIVOT
功能,q.v。如果您包含示例数据,可能会有人给您提供解决方法。@onedaywhen。问题中的
unpivot
将返回重复项。