Проблема с соединением для доступа SQL к базе данных Access - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь запустить какой-нибудь код SQL, который возвращает запись с максимальной начальной датой.Я использую оператор 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] Синтаксическая ошибка в операции JOIN

Я понимаю, что Access требует нескольких скобок, но я не могу найти, где их разместить?

Спасибо

Крис

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Вы хотите сослаться на 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;
0 голосов
/ 08 июня 2018

Псевдоним, который вы используете в условии внешнего соединения, неверен.Вы использовали 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, 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...