使用WHERE EXISTS删除查询匹配的子行比子查询返回的行数多

时间:2013-11-12 22:22:08

标签: ms-access ms-access-2010

我无法弄清楚我的删除语句是怎么回事,它想要删除比select语句返回的行多得多的行。

如果我在MS Access查询中运行以下命令,我会得到168行:

Select dbo_member.memberid from claims JOIN dbo_member on (claims.idnum = dbo_member.idnum);

dbo_member是一个SQL表,在MS Access中链接。声明是仅在MS Access中的表格。

当我运行它时,MS Access想要删除130K行:

Delete from claims where exists (Select dbo_member.memberid from claims JOIN dbo_member on (claims.idnum = dbo_member.idnum);)

当我之前做了一些其他删除语句时,它们有效,但我不记得那些加入它们的人。

1 个答案:

答案 0 :(得分:2)

您的问题有多个问题:

当我尝试在Access

中执行以下查询时
Select dbo_member.memberid 
from 
    claims 
    JOIN 
    dbo_member 
        on (claims.idnum = dbo_member.idnum);

我收到“FROM子句中的语法错误”。 Access SQL不支持非限定JOIN说明符。然而,

Select dbo_member.memberid 
from 
    claims 
    INNER JOIN 
    dbo_member 
        on (claims.idnum = dbo_member.idnum);

工作并返回168行。现在,对第二个查询应用相同的更正(并暂时忽略假的分号),

Delete from claims 
where exists 
    (
        Select dbo_member.memberid 
        from 
            claims 
            INNER JOIN 
            dbo_member 
                on (claims.idnum = dbo_member.idnum);
    )

表示要删除 [声明]表格中的每一行。为什么?这是因为您没有在子查询中包含WHERE子句,将其与外部查询相关联。因此,当数据库引擎询问“外部查询中的当前行的子查询中是否存在行?”答案总是“是”。

我真正想要的

DELETE FROM claims
WHERE 
    idnum IN
        (
            SELECT idnum FROM dbo_member
        )