SQL访问Access数据库的联接问题
我正在尝试运行一些SQLcode,以返回具有最大startdate的记录。我正在使用带有内部联接的Select语句 请参阅下面的代码SQL访问Access数据库的联接问题,sql,ms-access,powerbi,Sql,Ms Access,Powerbi,我正在尝试运行一些SQLcode,以返回具有最大startdate的记录。我正在使用带有内部联接的Select语句 请参阅下面的代码 Select t1.CH_Name_Initials as FirstName, t1.surname as Surname, t1.dt_start as StartDate, t1.dt_DOB as DateofBirth from tb_Pers t1 inner join (S
Select
t1.CH_Name_Initials as FirstName,
t1.surname as Surname,
t1.dt_start as StartDate,
t1.dt_DOB as DateofBirth
from
tb_Pers t1
inner join
(SELECT CH_Name_Initials, surname, dt_start,MAX(dt_start) as max_date,
dt_DOB
FROM
tb_Pers t2
group by
CH_Name_Initials,
t1.surname)
s2
on
t1.CH_Name_Initials = t2.CH_Name_Initials
and t1.surname = t2.surname
and t1.dt_start = t2.dt_start
and t1.dt_DOB = t2.dt_DOB
然而,当我尝试运行它时,我得到了错误消息
详细信息:ODBC:联接操作中出现错误[42000][Microsoft][ODBC Microsoft Access驱动程序]语法错误
我理解多个括号中的访问要求,但我很难找到放在哪里
谢谢
Chris在外部联接条件中使用的别名不正确。您使用了t2,它引用子查询中的一个表,而不是使用s2,s2正确地引用了子查询本身。请尝试以下版本:
SELECT
t1.CH_Name_Initials AS FirstName,
t1.surname AS Surname,
t1.dt_start AS StartDate,
t1.dt_DOB AS DateofBirth
FROM
tb_Pers t1
INNER JOIN
(
SELECT CH_Name_Initials, surname, MAX(dt_start) AS startdate, dt_DOB
FROM tb_Pers t2
GROUP BY CH_Name_Initials, surname, dt_DOB
) s2
ON t1.CH_Name_Initials = s2.CH_Name_Initials AND
t1.surname = s2.surname AND
t1.dt_start = s2.startdate AND
t1.dt_DOB = s2.dt_DOB
在外部联接条件中使用的别名不正确。您使用了t2,它引用子查询中的一个表,而不是使用s2,s2正确地引用了子查询本身。请尝试以下版本:
SELECT
t1.CH_Name_Initials AS FirstName,
t1.surname AS Surname,
t1.dt_start AS StartDate,
t1.dt_DOB AS DateofBirth
FROM
tb_Pers t1
INNER JOIN
(
SELECT CH_Name_Initials, surname, MAX(dt_start) AS startdate, dt_DOB
FROM tb_Pers t2
GROUP BY CH_Name_Initials, surname, dt_DOB
) s2
ON t1.CH_Name_Initials = s2.CH_Name_Initials AND
t1.surname = s2.surname AND
t1.dt_start = s2.startdate AND
t1.dt_DOB = s2.dt_DOB
如果要将t2引用为s2,可以在下面进行尝试
Select
t1.CH_Name_Initials as FirstName,
t1.surname as Surname,
t1.dt_start as StartDate,
t1.dt_DOB as DateofBirth
from
tb_Pers t1
inner join
(SELECT CH_Name_Initials, surname, dt_start,MAX(dt_start) as max_date,
dt_DOB
FROM
tb_Pers t2
group by
CH_Name_Initials,
t2.surname,
t2.dt_start,
t2.dt_DOB)
t2
on
t1.CH_Name_Initials = t2.CH_Name_Initials
and t1.surname = t2.surname
and t1.dt_start = t2.dt_start
and t1.dt_DOB = t2.dt_DOB;
你能这样试试吗
with cte as (
select max(dt_start) from tb_Pers
)
select CH_Name_Initials as FirstName,
surname as Surname,
dt_start as StartDate,
dt_DOB as DateofBirth
from
tb_Pers,cte where dt_start = cte.max;
如果要将t2引用为s2,可以在下面进行尝试
Select
t1.CH_Name_Initials as FirstName,
t1.surname as Surname,
t1.dt_start as StartDate,
t1.dt_DOB as DateofBirth
from
tb_Pers t1
inner join
(SELECT CH_Name_Initials, surname, dt_start,MAX(dt_start) as max_date,
dt_DOB
FROM
tb_Pers t2
group by
CH_Name_Initials,
t2.surname,
t2.dt_start,
t2.dt_DOB)
t2
on
t1.CH_Name_Initials = t2.CH_Name_Initials
and t1.surname = t2.surname
and t1.dt_start = t2.dt_start
and t1.dt_DOB = t2.dt_DOB;
你能这样试试吗
with cte as (
select max(dt_start) from tb_Pers
)
select CH_Name_Initials as FirstName,
surname as Surname,
dt_start as StartDate,
dt_DOB as DateofBirth
from
tb_Pers,cte where dt_start = cte.max;
Hi@Tim我随后收到一个错误“您试图执行的查询未将指定的表达式‘姓氏’作为聚合函数的一部分。”我已更改sql以选择s1.CH_Name_首字母作为FirstName,s1.Name作为姓氏,s1.dt_开始作为StartDate,s1.dt_DOB作为tb_Pers ts内部连接的出生日期选择CH_Name_首字母、姓氏、dt_start、MAXdt_start作为max_date,dt_DOB从tb_Pers group按CH_Name_首字母、姓氏、,dt_start s2在s1.CH_Name_Initials=s2.CH_Name_Initials和s1.lasname=s2.lasname和s1.dt_start=s2.dt_start和s1.dt_DOB=s2.dt_DOB,但我仍然收到错误:查询定义的选择列表中别名“dt_start”引起的循环引用。通过选择t1.CH_Name_Initials使其工作正常名字,t1。姓氏作为姓氏,t1.dt_作为起始日期,t1.dt_作为出生日期从tb_Pers t1内部连接选择CH_姓名首字母缩写,姓氏,MAXdt_作为起始日期,dt_DOB从tb_Pers t2组按CH_姓名首字母缩写,姓氏,dt_DOB s2在t1.CH_Name_Initials=s2.CH_Name_Initials和t1.lasname=s2.lasname和t1.dt_start=s2.startdate和t1.dt_DOB=s2.dt_DOBHi@Tim上,我收到一个错误“您试图执行的查询没有将指定的表达式‘姓氏’作为聚合函数的一部分。”s1.Chu Name_首字母作为名字,s1.姓氏作为姓氏,s1.dt_开始作为起始日期,s1.dt_DOB作为出生日期从tb_Pers ts内部连接选择Chu Name_首字母,姓氏,dt_开始,MAXdt_开始作为最大日期,dt_DOB从tb_Pers组按Chu Name_首字母,姓氏,dt_start s2在s1.CH_Name_Initials=s2.CH_Name_Initials和s1.lasname=s2.lasname和s1.dt_start=s2.dt_start和s1.dt_DOB=s2.dt_DOB,但我仍然收到错误:查询定义的选择列表中别名“dt_start”引起的循环引用。通过选择t1.CH_Name_Initials使其工作正常名字,t1。姓氏作为姓氏,t1.dt_作为起始日期,t1.dt_作为出生日期从tb_Pers t1内部连接选择CH_姓名首字母缩写,姓氏,MAXdt_作为起始日期,dt_DOB从tb_Pers t2组按CH_姓名首字母缩写,姓氏,t1.CH_Name_Initials=s2.CH_Name_Initials和t1.lasname=s2.lasname和t1.dt_start=s2.startdate和t1.dt_DOB=s2.dt_DOBMS访问不支持公共表表达式。MS访问不支持公共表表达式。