Sql Access中的内部联接不支持联接表达式

Sql Access中的内部联接不支持联接表达式,sql,ms-access,Sql,Ms Access,我在内部连接上遇到了“Join expression not supported”(连接表达式不受支持)错误。如果我删除它,它只适用于正确的连接,经过数小时的调查,仍然不知道原因 SELECT a.account_id, Sum(t.amount) AS SumOfamount FROM (tbl_input AS t right JOIN tbl_account AS a ON t.account = a.account_id) inner join tbl_cid c on

我在内部连接上遇到了“Join expression not supported”(连接表达式不受支持)错误。如果我删除它,它只适用于正确的连接,经过数小时的调查,仍然不知道原因

SELECT a.account_id,
       Sum(t.amount) AS SumOfamount
FROM (tbl_input AS t 
right JOIN tbl_account AS a ON t.account = a.account_id)
inner join tbl_cid c on (c.cid = t.cid and c.segment not like 'VGE')
WHERE a.account_id In ('R1001', 'R1002', 'R1004', 'C1001', 'C2001', 'C2003', 'C3003')
GROUP BY a.account_id, t.hfm_classification
ORDER BY 
IIf([a.account_id]='R1001',0,
IIf([a.account_id]='R1002',1,
IIf([a.account_id]='R1004' And [t.hfm_classification]='MDS',2,
IIf([a.account_id]='R1004' And [t.hfm_classification]='M2M',3,
IIf([a.account_id]='R1004' And [t.hfm_classification]='Fixed',4,
IIf([a.account_id]='C1001',5,
IIf([a.account_id]='C2001',6,
IIf([a.account_id]='C2003',7,
IIf([a.account_id]='C3003',8)))))))));

MS-Access对连接条件是变化无常的

在您的情况下,内部联接正在将外部联接转换为内部联接,因为:

右连接将所有行保持为一个。 t中不匹配的行被设置为NULL。 c的连接条件使用t。空值将使该比较失败。 因此,您不妨将整个逻辑表示为内部联接

很明显,您可以将条件移动到where子句:

右连接可以写为左连接,我认为这也是3d表所需要的:

SELECT a.account_id,
       Sum(x.amount) AS SumOfamount
FROM tbl_account AS a LEFT JOIN (
  SELECT * 
  FROM tbl_input AS t INNER JOIN tbl_cid AS C
  ON c.cid = t.cid
  WHERE c.segment <> 'VGE'
) AS x ON (x.account = a.account_id)
WHERE a.account_id IN ('R1001', 'R1002', 'R1004', 'C1001', 'C2001', 'C2003', 'C3003')
GROUP BY a.account_id, t.hfm_classification
ORDER BY....

如果我将简单连接修改为右连接,它就会起作用。但我的问题是,我需要tbl_账户中的每一项,即使没有匹配项。这就是为什么我以前用右键连接。但使用此代码时,只会出现匹配的对帐户ID。你能帮我修改代码以查看tbl_account的所有内容吗?帐户ID位于'R1001','R1002','R1004','C1001','C2001','C2003','C3003'?@Looz。这个问题是关于修复语法的——现在添加了internal关键字,就可以修复语法了。如果这不符合你的要求,问一个新问题。提供示例数据、所需结果、逻辑解释和当前查询。新问题不应作为评论提出。不,这不是关于修正语法,因为这不是我想要的。->没有新问题,只是想告诉您解决方案有什么问题。我不能在tbl_cid上使用left join,因为它保留了来自tbl_输入的行,其中c.segment='VGE',这正是我希望使用内部联接避免的。将此左联接覆盖到内部联接会产生相同的错误,请您提出建议。如果您在tbl_cid上不使用左联接,则会丢失tbl_帐户中所有不匹配的行。是的,但我需要tbl_cid,因为这些段存在,我需要对它们进行筛选,以接收与此相同的记录集。tbl\U CIDU中仍有与VGE段相关的行,这是怎么可能的?段“VGE”不返回段=VGE的行的条件!!!MS Access 1要求在外部联接之前写入内部联接,2不允许在联接条件中使用常量表达式。您“违反”了以下两项:
SELECT a.account_id,
       Sum(x.amount) AS SumOfamount
FROM tbl_account AS a LEFT JOIN (
  SELECT * 
  FROM tbl_input AS t INNER JOIN tbl_cid AS C
  ON c.cid = t.cid
  WHERE c.segment <> 'VGE'
) AS x ON (x.account = a.account_id)
WHERE a.account_id IN ('R1001', 'R1002', 'R1004', 'C1001', 'C2001', 'C2003', 'C3003')
GROUP BY a.account_id, t.hfm_classification
ORDER BY....