Ms Access 不支持 JOIN 表达式 table
JOIN expression not supported in MsAccess table
我目前有一个名为 RECHEADS
的 table,如下所示。我希望删除共享相同 CUSQ
、CCNI
、DATV
和 PROD
值但具有后续 SREFQ
数字的重复项。
所以,在这种情况下,我想删除 NAT 785
、NAT 786
和 METRO 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, " "))
)
);
我目前有一个名为 RECHEADS
的 table,如下所示。我希望删除共享相同 CUSQ
、CCNI
、DATV
和 PROD
值但具有后续 SREFQ
数字的重复项。
所以,在这种情况下,我想删除 NAT 785
、NAT 786
和 METRO 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, " "))
)
);