访问 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(例如,
BY
、JOIN
、YEAR
、POSITION
、NO
)
您的查询中有几个地方需要它:
表格
[2019_01] AS A
[201200]
`2019_01` AS A
`201200`
带有句点限定符的列 [Table].[Column]
:
[201200].[G/L Acct]
`201200`.`G/L Acct`
保留字
A.[User]
A.[Order]
A.`User`
A.`Order`
最后,从 MS Access 到 SQLite 再到 Oracle 和 Postgres 的任何关系数据库的最佳实践是避免这些情况,只使用不带空格、符号或以数字开头的字母数字来命名 tables、列、存储过程、查询、视图和任何其他对象。
似乎没有很多关于如何正确使用方括号指定 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(例如,
BY
、JOIN
、YEAR
、POSITION
、NO
)
您的查询中有几个地方需要它:
表格
[2019_01] AS A [201200] `2019_01` AS A `201200`
带有句点限定符的列
[Table].[Column]
:[201200].[G/L Acct] `201200`.`G/L Acct`
保留字
A.[User] A.[Order] A.`User` A.`Order`
最后,从 MS Access 到 SQLite 再到 Oracle 和 Postgres 的任何关系数据库的最佳实践是避免这些情况,只使用不带空格、符号或以数字开头的字母数字来命名 tables、列、存储过程、查询、视图和任何其他对象。