2015-02-06 49 views
0

我试过寻找这个答案,但找不到一个。更改微软访问的cte

我有一个CTE我使用与数据库中的2代数据表的SQL查询。一个表的主键是另一个表中的外键,可以在第二个表中出现多次。我想对每个外键出现在第二个表中的次数进行计数,并将其列为我的搜索结果中的总字段以及第一个表中的详细信息。由于CTE不能在Access中工作,我已经调整了这个以在连接中使用子选择,但它仍然不喜欢它在访问中。

下面是表

CREATE TABLE [dbo].[Clients](
    [ClientRef] [int] NOT NULL, 
    [Surname] [varchar](40) NULL, 
    [Forenames] [varchar](50) NULL, 
    [Title] [varchar](40) NULL, 
CONSTRAINT [CLIE_ClientRef_PK] PRIMARY KEY CLUSTERED 
(
    [ClientRef] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

CREATE TABLE [dbo].[Policies](
    [PolicyRef] [int] NOT NULL, 
    [ClientRef] [int] NULL, 
CONSTRAINT [POLI_PolicyRef_PK] PRIMARY KEY CLUSTERED 
(
    [PolicyRef] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

的基本组成部分这是我的CTE

WITH CliPol (ClientRef, Plans) AS (SELECT ClientRef, COUNT(ClientRef) AS Plans FROM Policies GROUP BY ClientRef) 
SELECT Clients.Surname, Clients.Forenames, Clients.Title, CliPol.Plans AS [No. of plans] 
FROM Clients LEFT JOIN CliPol ON Clients.ClientRef = CliPol.ClientRef 
ORDER BY Surname, Forenames; 

这是我的调整查询。

SELECT Clients.ClientRef, Clients.Surname, Clients.Forenames, Clients.Title , Plans.NoPlans 
FROM Clients 
LEFT JOIN 
    (SELECT ClientRef, COUNT(ClientRef) AS NoPlans FROM Policies GROUP BY ClientRef) 
    AS Plans ON Plans.ClientRef = Clients.ClientRef 
ORDER BY Clients.Surname, Clients.Forenames 

不幸的是访问抛出错误#3131,“语法错误在FROM子句”,当我试图运行查询。

有谁知道我是怎么做的访问这项工作?

+0

你得到什么错误?尝试更改连接子句中的列顺序(“Clients.ClientRef = Plans.ClientRef”) – 2015-02-06 13:58:01

+1

当你说Access不喜欢你的子查询方法时,是否意味着它通过抛出错误信息来投诉? – HansUp 2015-02-06 13:58:06

+0

嗨,对不起,是的,它告诉我在FROM子句中有一个语法错误(错误3131)。 – welshsteve147 2015-02-06 14:14:50

回答

1

一种替代的方法是使用DCOUNT()域聚合函数

SELECT 
    Clients.ClientRef, 
    Clients.Surname, 
    Clients.Forenames, 
    Clients.Title , 
    DCount("ClientRef", "Plans", "ClientRef=" & Clients.ClientRef) AS NoPlans 
FROM Clients 
ORDER BY Clients.Surname, Clients.Forenames