Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql MsAccess表中不支持联接表达式_Sql_Ms Access 2010_Inner Join - Fatal编程技术网

Sql MsAccess表中不支持联接表达式

Sql MsAccess表中不支持联接表达式,sql,ms-access-2010,inner-join,Sql,Ms Access 2010,Inner Join,我目前有一个名为RECHEADS的表,如下所示。我希望删除共享相同CUSQ、CCNI、DATV和PROD值但具有后续SREFQ编号的重复项 因此,在本例中,我想删除NAT 785、NAT 786和METRO 3206 CUSQ | CCNI | DATV | SREFQ | PROD ---- ----- ----- ------ ------ 14 |詹姆斯·弗莱彻| 13/03/2017 | NAT 784 | 00018-144X 14 |詹姆斯·弗莱彻| 13/03

我目前有一个名为
RECHEADS
的表,如下所示。我希望删除共享相同
CUSQ
CCNI
DATV
PROD
值但具有后续
SREFQ
编号的重复项

因此,在本例中,我想删除
NAT 785
NAT 786
METRO 3206

CUSQ | CCNI | DATV | SREFQ | PROD
----    -----    -----   ------   ------ 
14 |詹姆斯·弗莱彻| 13/03/2017 | NAT 784 | 00018-144X
14 |詹姆斯·弗莱彻| 13/03/2017 | NAT 785 | 00018-144X
14 |詹姆斯·弗莱彻| 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
我尝试了以下方法,但内部查询给了我

不支持联接表达式

试试这个:

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
比较(并且您需要将整个
部分括在括号中:

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列可以包含多个空格,则需要以不同的方式提取数字部分(从右侧而不是从左侧查找“”字符)。只需将
instr
替换为
instrev

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, " "))
        )
    );

您键入的内容是否正确:
t2.cusq=t1.cus1
?@Manngo My bad,我已经纠正了这个问题。您是否尝试在表达式周围加括号:
(t2.cusq=t1.cusq)
。有一个bug提到了这一点:当它抱怨“FROM子句中的语法错误”时,没有任何乐趣.第一个解决方案在技术上可行,尽管我得到“条件表达式中的数据类型不匹配”很可能是因为srefq是一个字符串值,我没有正确处理。我忘记了
t2.prod=t1.prod
之后。另外,最后一次连接比较的右侧应该引用
t1
而不是
t2
。我已经更新了答案。嗯,我已经复制并粘贴了第二个解决方案,并且正确无误uns对我来说。第二个现在起作用了。唯一的问题是它们都给了我一个数据类型不匹配。我认为这是由于我的数据。CUSQ是文本类型,CCNI是文本类型,DATV是日期/时间类型,SREFQ是文本类型,PROD是文本类型。这很奇怪。SREFQ是什么数据类型?是短文本吗?你可以尝试包装
对吗
>函数在比较之前将它们转换为整数。
CInt(右(t2.srefq,len(t2.srefq)-instr(t2.srefq,”))+1=CInt(右(t1.srefq,len(t1.srefq)-instr(t1.srefq,”)
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, " "))
        )
    );