SQL - 不支持连接表达式
Posted
技术标签:
【中文标题】SQL - 不支持连接表达式【英文标题】:SQL - Join Expression Not Supported 【发布时间】:2013-05-05 06:17:40 【问题描述】:我是使用 Access 并尝试更改此查询的新手:
SELECT
DateDiff("d", [Invoice]![TxnDate],[ReceivePaymentLine]![TxnDate]) AS ActualPaymentDays,
IIF ([ActualPaymentDays] < 90, 0.10, IIF ([ActualPaymentDays] < 120, 0.09, IID ([ActualPaymentDays] , 365, 0.05, 0))) AS PayPerValue
FROM
ReceivePaymentLine
INNER JOIN
Invoice ON ReceivePaymentLine.AppliedToTxnTxnID = Invoice.TxnID
我制作“ActualPaymentDaysRate”表:
ActualPaymentDay1
PayPerValue1
ActualPaymentDay2
PayPerValue2
ActualPaymentDay3
PayPerValue3
我把上面的查询改成这个查询:
SELECT
DateDiff("d",[Invoice]![TxnDate],[ReceivePaymentLine]![TxnDate]) AS ActualPaymentDays,
IIF ([ActualPaymentDays] < [ActualPaymentDaysRate.ActualPaymentDay1],[ActualPaymentDaysRate.PayPerValue1], IIF ([ActualPaymentDays] < [ActualPaymentDaysRate.ActualPaymentDay2], [ActualPaymentDaysRate.PayPerValue2], IIF ([ActualPaymentDays] < [ActualPaymentDaysRate.ActualPaymentDay3],[ActualPaymentDaysRate.PayPerValue3], 0))) AS PayPerValue
FROM
ActualPaymentDaysRate, ReceivePaymentLine
INNER JOIN
Invoice ON ReceivePaymentLine.AppliedToTxnTxnID = Invoice.TxnID
它显示错误“不支持 JOIN 表达式”。
【问题讨论】:
可能是因为JON与“INNER JOIN”无关? 感谢您的回复。我确实在我的 Access 中输入了“JOIN”并显示了该错误。抱歉,我在此论坛上输入“JON”时出错(我在其他没有互联网连接的计算机上使用 Microsoft Access,这就是我无法复制和粘贴查询的原因)。 【参考方案1】:您不能混合匹配旧样式和新样式连接语法。
添加另一个连接:
SELECT DateDiff("d",[Invoice]![TxnDate],[ReceivePaymentLine]![TxnDate]) AS ActualPaymentDays, IIF ([ActualPaymentDays] < [ActualPaymentDaysRate.ActualPaymentDay1],[ActualPaymentDaysRate.PayPerValue1],IIF ([ActualPaymentDays] < [ActualPaymentDaysRate.ActualPaymentDay2],[ActualPaymentDaysRate.PayPerValue2], IIF ([ActualPaymentDays] < [ActualPaymentDaysRate.ActualPaymentDay3],[ActualPaymentDaysRate.PayPerValue3], 0))) AS PayPerValue
FROM ReceivePaymentLine
INNER JOIN Invoice ON ReceivePaymentLine.AppliedToTxnTxnID = Invoice.TxnID
JOIN ActualPaymentDaysRate ON some condition
此外,您在查询中将 JOIN 拼写为“JON”。我在这篇文章中更正了这一点。
【讨论】:
问题是:不确定如何使“ON some condition”。 ActualPaymentDaysRate 表只有一条记录(并且“ActualPaymentDay1、ActualPaymentDay2、ActualPaymentDay3 的字段与 DateDiff("d",[Invoice]![TxnDate],[ReceivePaymentLine]![TxnDate]) AS ActualPaymentDays 相关。我想做动态IF(现在 ActualPaymentDays 【参考方案2】:您做错的是同时使用 ANSI SQL-89 语法和 ANSI SQL-92 JOIN 语法
INNER JOIN
的旧语法是 ANSI SQL-89,您可以在其中指定用逗号分隔的两个表名,您在查询中这样做
SELECT <column list>
FROM ActualPaymentDaysRate, ReceivePaymentLine
ANSI SQL-92 语法是您使用 JOIN
关键字并使用 ON
指定条件,就像您所做的一样
INNER JOIN Invoice ON ReceivePaymentLine.AppliedToTxnTxnID = Invoice.TxnID
但是您不能在同一查询中同时使用它们。
在您的查询中,您有三个表,因此使用三个 INNER JOIN
链接这些表。
不建议使用 ANSI SQL-89 语法,因为如果忘记连接条件,不会产生错误,而是在返回所有行的表之间应用笛卡尔积。
SELECT <column list>
FROM ActualPaymentDaysRate, ReceivePaymentLine
-- WHERE <condition> excluded , NOT a INNER JOIN anymore but still no error
但是如果你忘记了 SQL-92 语法中的条件,就会立即产生错误。
【讨论】:
我明白了。谢谢你的解释。知道如何解决我的查询吗?谢谢【参考方案3】:您的问题是您在内部联接中指定了两个表名,您需要两个内部联接来联接 3 个表。
看这个。
SELECT DateDiff("d",[Invoice]![TxnDate],[ReceivePaymentLine]![TxnDate]) AS ActualPaymentDays,
IIF ([ActualPaymentDays] < [ActualPaymentDaysRate.ActualPaymentDay1],[ActualPaymentDaysRate.PayPerValue1],
IIF ([ActualPaymentDays] < [ActualPaymentDaysRate.ActualPaymentDay2],[ActualPaymentDaysRate.PayPerValue2],
IIF ([ActualPaymentDays] < [ActualPaymentDaysRate.ActualPaymentDay3],[ActualPaymentDaysRate.PayPerValue3], 0))) AS PayPerValue
FROM ActualPaymentDaysRate INNER JOIN ReceivePaymentLine
ON <Match Condition>
INNER JOIN Invoice
ON ReceivePaymentLine.AppliedToTxnTxnID = Invoice.TxnID
【讨论】:
感谢您的帮助。但是 ActualPaymentDaysRate 与其他表之间没有匹配键。 ActualPaymentDaysRate 表只有一条记录(并且“ActualPaymentDay1、ActualPaymentDay2、ActualPaymentDay3 的字段与 DateDiff("d",[Invoice]![TxnDate],[ReceivePaymentLine]![TxnDate]) AS ActualPaymentDays 相关。我想做动态IF(现在 ActualPaymentDays以上是关于SQL - 不支持连接表达式的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Microsoft 不支持到 SQL Azure 的 OLE DB 连接?
错误 3296:具有多个 JOIN 的 MS Access 查询中不支持连接表达式
csharp 解析通过T-SQL从连接子句推断外键 - 注意:不完整。只支持seroc中的sprocs和一些语法结构
微软SQL Server 2008 R2 标准版(25用户)最大并发连接数是多少?及支持多少客户端同时访问