Синтаксическая ошибка в операции объединения в MS-Access при разбиении и сравнении записей - PullRequest
0 голосов
/ 01 декабря 2010

Выше приведено сообщение об ошибке с этим оператором:

 SELECT f.fullname INTO SummaryJudgment_FinalForgottenWithMiddle
FROM (
(SELECT Left([aname],InStr(1,[aname],",")-1)) As lastname FROM
SummaryJudgment_FinalForgotten) & " " & (SELECT
RIGHT([aname],InStr(1,[aname],",")+1)) As firstname FROM
SummaryJudgment_FinalForgotten) & " " & (SELECT
summary_judgment.middle_initial AS middlename FROM summary_judgment)
) AS fullname
FROM SummaryJudgment_FinalForgotten AS f INNER JOIN summary_judgment
AS s ON f.lastname = s.last_name && f.firstname = s.first_name;

По сути, так выглядят две таблицы (обратите внимание, что в них будет больше полей, чем 1, где фамилия или имя разных полей могут быть похожими):

SummaryJudgment_FinalForgotten (table)
aname (field)
Leventhal,Raymond (data)


summary_judgment (table)
first_name(field)
Raymond (data)
last_name (field)
Leventhal (data)
middle_initial (field)
P (data)

В конце концов, я пытаюсь создать новую таблицу, похожую на SummaryJudgment_FinalForgotten, но с добавленной средней инициализацией из summary_judgment: Leventhal, Raymond P

Ответы [ 3 ]

1 голос
/ 01 декабря 2010

Вы пытаетесь использовать два амперсанда для представления логического И?

FROM SummaryJudgment_FinalForgotten AS f INNER JOIN summary_judgment
AS s ON f.lastname = s.last_name && f.firstname = s.first_name;

Не думаю, что это законно для движков базы данных Access / Jet / ACE.Попробуйте это с ключевым словом AND вместо &&.

OTOH, интересно, вы можете сделать что-нибудь попроще.

SELECT last_name & "," & first_name & " " & middle_initial AS fullname
INTO SummaryJudgment_FinalForgottenWithMiddle
FROM summary_judgment;
1 голос
/ 01 декабря 2010

Вам не нужно писать 3 оператора select, чтобы объединить значения в одно поле.

select left(...) & right(...) & initial AS fullname INTO SummaryJudgment_FinalForgottenWithMiddle
 FROM SummaryJudgment_FinalForgotten
0 голосов
/ 01 декабря 2010

Это работает:

SELECT left([aname],InStr(1,[aname],",")-1) & " " 
     & right([aname],Len(aname)-InStr(1,[aname],",")) & " "
     & summary_judgment.middle_initial AS fullname 
INTO SummaryJudgment_FinalForgottenWithMiddle
FROM SummaryJudgment_FinalForgotten, summary_judgment;

Хотя вы можете вместо этого:

SELECT left([aname],InStr(1,[aname],",")-1) & ", " 
     & right([aname],Len(aname)-InStr(1,[aname],",")) & " "
     & summary_judgment.middle_initial AS fullname 
INTO SummaryJudgment_FinalForgottenWithMiddle
FROM SummaryJudgment_FinalForgotten, summary_judgment;

Вторая версия дает вам запятую после фамилии.Обратите внимание, что Right считает из вправо, поэтому вы должны вычесть значение InStr из длины.

EDIT:

КодЯ дал выше работы с вашими примерами данных - по одной строке в каждой таблице.С большим количеством строк он дает перекрестный продукт (LastName, FirstName) x MiddleInitial.Мне пришло в голову, что это может быть так, поэтому я вернулся к своему тесту и добавил вторую строку - это - это true.И тогда я попытался написать выражение соединения ....

Доступ не похож на это:

... ON left([aname],InStr(1,[aname],",")-1) = last_name ...

Выдает ошибку «Выражение соединения не поддерживается».Если изменить его следующим образом:

... ON (trim((left(SummaryJudgment_FinalForgotten.aname,InStr(1,[aname],",")-1))=trim(summary_judgment.last_name))) ...

приводит к запросу, который запускает и создает таблицу, но не создает никаких строк (то же самое было до того, как я добавил вызовы "trim" в попытке исправитьэто).

Поэтому я попытался указать таблицу для всех случаев анаме.Никакой радости - пока я не осознал, что я делал неправильное сравнение (производные от последнего к последнему и производные от первого к последнему - упс).

Использование следующего предложения FROM с любым из указанных выше SELECT ... INTO работает правильно:

FROM 
  SummaryJudgment_FinalForgotten INNER JOIN 
  summary_judgment ON 
    ((left(SummaryJudgment_FinalForgotten.aname,InStr(1,SummaryJudgment_FinalForgotten.[aname],",")-1))=summary_judgment.last_name) AND 
    ((right(SummaryJudgment_FinalForgotten.aname,Len(SummaryJudgment_FinalForgotten.aname)-InStr(1,SummaryJudgment_FinalForgotten.[aname],","))=summary_judgment.first_name));

Это может работать даже без полной квалификации каждого поля теперь, когда я присоединяюсь сначала к первому и к последнему к последнему (так как нет дублированиячерез столы), но доказав, что это работает, я готов.

...