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