【问题标题】:Syntax Error in Join Operation in MS-Access when splitting and comparing records拆分和比较记录时 MS-Access 中的联接操作中的语法错误
【发布时间】:2010-12-01 14:02:47
【问题描述】:

此语句出现上述错误消息:

 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,雷蒙德 P

【问题讨论】:

    标签: sql ms-access split compare append


    【解决方案1】:

    您不需要编写 3 个选择语句来将值连接到一个字段中。

    select left(...) & right(...) & initial AS fullname INTO SummaryJudgment_FinalForgottenWithMiddle
     FROM SummaryJudgment_FinalForgotten
    

    【讨论】:

    • 所以你说的是这样的:select left([aname],InStr(1,[aname],",")-1)) & right([aname],InStr(1, [aname],",")+1)) & summary_judgment.middle_initial AS 全名 INTO SummaryJudgment_FinalForgottenWithMiddle FROM SummaryJudgment_FinalForgotten, summary_judgment
    • 没错。这就是我的意思。
    【解决方案2】:

    您是否尝试使用两个 & 符号来表示逻辑与?

    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;
    

    【讨论】:

      【解决方案3】:

      这行得通:

      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 值。

      编辑:

      我上面给出的代码适用于您的示例数据——每个表中的一行。有了更多的行,它给出了 (LastName, FirstName) x MiddleInitial 的叉积。我突然想到可能是这种情况,所以我回到我的测试并添加了第二行——它正确的。于是我试着写了连接表达式......

      访问不喜欢这样:

      ... 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”调用以尝试修复它之前也是如此)。

      所以我尝试为所有出现的名称指定表。不高兴——直到我意识到我在进行错误的比较(从最后到最后派生和从先到后派生——哎呀)。

      在上面的 SELECT ... INTO 中使用以下 FROM 子句 是否 可以正常工作:

      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));
      

      既然我从第一个到最后一个加入(因为表格之间没有重复),它甚至可能在没有每个字段的完整限定的情况下正常工作,但证明它确实有效,我完成。

      【讨论】:

      • 哇!您发布的最后一个 FROM 子句是缺失的部分。
      猜你喜欢
      • 2013-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多