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用户)最大并发连接数是多少?及支持多少客户端同时访问

NotImplementedError:此表达式不支持运算符“getitem”

如何修复此错误:不支持 SQL92?