Ms Access 不支持 JOIN 表达式 table

JOIN expression not supported in MsAccess table

我目前有一个名为 RECHEADS 的 table,如下所示。我希望删除共享相同 CUSQCCNIDATVPROD 值但具有后续 SREFQ 数字的重复项。

所以,在这种情况下,我想删除 NAT 785NAT 786METRO 3206

CUSQ  |  CCNI          |  DATV      | SREFQ      | PROD
----    -----    -----   ------   ------ 
14    | James FLETCHER | 13/03/2017 | NAT 784    |00018-144X
14    | James FLETCHER | 13/03/2017 | NAT 785    |00018-144X
14    | James FLETCHER | 13/03/2017 | NAT 786    |00018-144X
19    | DENISE FORZANI | 14/03/2017 | METRO 3205 | 05239-01P
19    | DENISE FORZANI | 14/03/2017 | METRO 3206 | 05239-01P
19    | DENISE FORZANI | 14/03/2017 | METRO 3207 | 05239-01Q

我尝试了以下方法,但内部查询给了我

JOIN expression not supported

DELETE FROM table
WHERE SREFQ IN 
    (
        SELECT t1.SREFQ
        FROM RECHEADS AS t1
            INNER JOIN RECHEADS AS t2 ON       
                t2.cusq = t1.cusq AND
                t2.ccni = t1.ccni AND
                t2.datv = t1.datv AND
                right(t2.srefq, len(t2.srefq)-instr(t2.srefq, " ")) + 1 = right(t2.srefq, len(t2.srefq)-instr(t2.srefq, " "))
    );

试试这个:

DELETE FROM RECHEADS
WHERE SREFQ IN 
(
    select r1.SREFQ
    from RECHEADS r1
    where exists (select * 
           from RECHEADS r2 
           where r2.CUSQ = r1.CUSQ and 
           r2.CCNI = r1.CCNI and 
           r2.DATV = r1.DATV and 
           r2.PROD = r1.PROD and 
           right(r1.srefq, len(r1.srefq)-instr(r1.srefq, " ")) = right(r2.srefq, len(r2.srefq)-instr(r2.srefq, " ")) + 1)
)

实际上,您的查询应该有效,您只是忘记在连接中添加 PROD 比较(并且您需要将整个 ON 部分括在括号中:

DELETE FROM RECHEADS
WHERE SREFQ IN 
    (
        SELECT t1.SREFQ
        FROM RECHEADS AS t1
        INNER JOIN RECHEADS AS t2 ON
        (     
                t2.cusq = t1.cusq AND
                t2.ccni = t1.ccni AND
                t2.datv = t1.datv AND
                t2.prod = t1.prod AND
                right(t2.srefq, len(t2.srefq)-instr(t2.srefq, " ")) + 1 = right(t1.srefq, len(t1.srefq)-instr(t1.srefq, " "))
        )
    );

更新

如果您的 SREFQ 列可以包含多个 space,那么您需要以不同的方式提取数字部分(通过从右侧而不是左侧查找“ ”字符) .只需将 instr 替换为 instrrev:

DELETE FROM RECHEADS
WHERE SREFQ IN 
    (
        SELECT t1.SREFQ
        FROM RECHEADS AS t1
        INNER JOIN RECHEADS AS t2 ON
        (     
                t2.cusq = t1.cusq AND
                t2.ccni = t1.ccni AND
                t2.datv = t1.datv AND
                t2.prod = t1.prod AND
                right(t2.srefq, len(t2.srefq)-instrrev(t2.srefq, " ")) + 1 = right(t1.srefq, len(t1.srefq)-instrrev(t1.srefq, " "))
        )
    );