访问 SQL 加入

Access SQL Join

似乎没有很多关于如何正确使用方括号指定 table 名称的好/简明说明...我 运行 遇到了几个问题。希望有人愿意/能够帮我审核以下代码:

SELECT 
  A.Ccode,
  A.[Doc Type],
  A.[Doc Number],
  A.[Cross Company],
  A.[Doc Date],
  A.[Posting Date],
  A.Period,
  A.[Doc Header Text],
  A.Reference,
  IIf([2019_01].Cross Company] Is Not Null, [cc.vendor], [doc.vendor]) AS [SAP#],
  IIf([2019_01.G/L]<>"201200", [2019_01.G/L], IIf([201200.G/L Acct] Is Not Null, [201200.G/L Acct], "500140")) AS [G/L Acct],
  A.[G/L],
  A.[Cost Center],
  A.[WBS Element],
  A.Order,
  A.Plant,
  A.[Purchase Doc],
  A.Line,
  A.[D/C],
  IIf([D/C]="s", [Amount in LC]*1, [Amount in LC]*-1) AS [Amount(USD)],
  A.USD,
  IIf([D/C]="s", [Amount in DC]*1, [Amount in DC]*-1) AS [Amount(Doc)],
  A.Curr,
  IIf([D/C]="S", [Original Tax Base LC]*1, [Original Tax Base LC]*-1) AS [Tax Base LC],
  A.[Loc Curr],
  IIf([D/C]="S", [Original Tax Base DC]*1, [Original Tax Base DC]*-1) AS [Tax Base DC],
  A.[Doc Cur],
  A.User,
  A.[Tax Code],
  A.[Tax Jurisdiction],
  A.[Entry Date]
INTO [Final 2019_01]
FROM 
(
  (
    2019_01 AS A 
    LEFT JOIN CC AS X ON A.[Cross Company] = X.[Cross Company]
  ) 
  LEFT JOIN Doc AS Y ON (A.[Doc Number] = Y.[Doc Number]) AND (A.Ccode = Y.Ccode)
)
LEFT JOIN 201200 ON (A.Line = [201200].Item) AND (A.[Purchase Doc] = [201200].[Purchase Doc])
WHERE 
(
  (
    (A.Period)="1"
  )
  AND 
  (
    (A.Reference) Not Like "*TREE*"
  )
  AND 
  (
    (
      IIf([2019_01.G/L]<>"201200", [2019_01.G/L], IIf([201200.G/L Acct] Is Not Null, [201200.G/L Acct], "500140"))
    ) Not Like 132100
  ) 
  AND 
  (
    (A.[G/L])<>"200100"
  )
);

MS Access 连接很麻烦。您必须将每个连接嵌套在一对括号中:

FROM 
(
  (
    (
      [2019_01] AS A 
      LEFT JOIN CC AS X ON A.[Cross Company] = X.[Cross Company]
    ) 
    LEFT JOIN Doc AS Y ON A.[Doc Number] = Y.[Doc Number] AND A.Ccode = Y.Ccode
  )
  LEFT JOIN [201200] ON A.Line = [201200].Item AND A.[Purchase Doc] = [201200].[Purchase Doc]
)
WHERE A.Period = 1
  AND A.Reference NOT LIKE '*TREE*'
  AND IIf([2019_01.G/L] <> 201200, [2019_01.G/L], IIf([201200.G/L Acct] Is Not Null, [201200.G/L Acct], 500140)) <> 132100
  AND A.[G/L] <> 200100;

您还缺少 [ on:

IIf([2019_01].Cross Company] Is Not Null

MS Access 查询中的所有标识符,包括 table 和 SQL 查询中任意位置使用的字段名称(SELECT 表达式、JOIN 子句、WHERE 条件等)包含以下内容的必须使用方括号或反引号进行转义:

  • 名称中任意位置的特殊字符(例如,!@#$%^&*()~+),包括空格。 例外:下划线,_,可以在任何地方使用,甚至在名称的开头。
  • 以数字开头(例如,1234567890
  • Reserved words(例如,BYJOINYEARPOSITIONNO

您的查询中有几个地方需要它:

  1. 表格

    [2019_01] AS A
    [201200]
    
    `2019_01` AS A
    `201200`
    
  2. 带有句点限定符的列 [Table].[Column]:

    [201200].[G/L Acct]
    
    `201200`.`G/L Acct`
    
  3. 保留字

    A.[User]
    A.[Order]
    
    A.`User`
    A.`Order`
    

最后,从 MS Access 到 SQLite 再到 Oracle 和 Postgres 的任何关系数据库的最佳实践是避免这些情况,只使用不带空格、符号或以数字开头的字母数字来命名 tables、列、存储过程、查询、视图和任何其他对象。