Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL访问Access数据库的联接问题_Sql_Ms Access_Powerbi - Fatal编程技术网

SQL访问Access数据库的联接问题

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

我正在尝试运行一些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 
      (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访问不支持公共表表达式。