SQL删除自,子查询语法错误

SQL删除自,子查询语法错误,sql,database,ms-access,ms-access-2010,Sql,Database,Ms Access,Ms Access 2010,我在MS Access 2010中运行SQL代码时遇到困难。我想请求帮助复习和改正它 数据: -两个表的名称为:Tbl\u 001\u WholeBase和Tbl\u 002\u NewKVG -它们通过名为Key 问题: 我想从Tbl\u 001\u WholeBase中删除所有具有键的行,这些键在Tbl\u 002\u NewKVG 示例: Tbl_001_整个数据库 ID Key 1 Hronic1 2 Hronic2 3 Hronic3 Tbl\u 002\u NewKVG ID


我在MS Access 2010中运行SQL代码时遇到困难。我想请求帮助复习和改正它

数据:
-两个表的名称为:
Tbl\u 001\u WholeBase
Tbl\u 002\u NewKVG

-它们通过名为
Key

问题:
我想从
Tbl\u 001\u WholeBase
中删除所有具有
键的行,这些键在
Tbl\u 002\u NewKVG

示例:

Tbl_001_整个数据库

ID Key
1  Hronic1
2  Hronic2
3  Hronic3
Tbl\u 002\u NewKVG

ID Key 
1  Hronic1 
2  Hronic2 
因此,我想在
Tbl_001_WholeBase
中只留下第三条记录,基址如下:

ID Key
3  Hronic3  
我想在Access中使用的是:

DELETE 
FROM Tbl_001_WholeBase 
WHERE Tbl_001_WholeBase.KEY IN 
(SELECT * 
FROM Tbl_001_WholeBase 
LEFT JOIN Tbl_002_NewKVG 
ON Tbl_001_WholeBase.Key = Tbl_002_NewKVG.Key 
WHERE (((Tbl_002_NewKVG.Key) Is Null)));

子查询工作正常,但我无法将其与Delete语句连接。

运行此代码时出现的错误是:

您编写了一个子查询,该子查询可以返回多个字段,而无需在主查询的FROM子句中使用Exists保留字。修改子查询的SELECT语句以仅请求一个字段


在子查询中选择一个键,而不是(*)


这里的
keyId
将是您要删除行的列名或唯一键。

使用
左连接将两个表连接起来

这将返回联接左侧表中的所有记录,以及右侧表中的所有匹配记录<当右边的记录不可用时,使用code>NULL

SELECT  *
FROM    Tbl_001_WholeBase LEFT JOIN Tbl_001_NewKVG ON Tbl_001_WholeBase.Key = Tbl_001_NewKVG.Key  

| Tbl_001_WholeBase.ID | Tbl_001_WholeBase.Key | Tbl_001_NewKVG.ID | Tbl_001_NewKVG.Key |
|----------------------|-----------------------|-------------------|--------------------|
| 1                    | Hronic1               | 1                 | Hronic1            |
| 2                    | Hronic2               | 2                 | Hronic2            |
| 3                    | Hronic3               | NULL              | NULL               |
您可以看到最后一个
NewKVG.Key
为空,因此可以从结果中忽略它:

SELECT  *
FROM    Tbl_001_WholeBase LEFT JOIN Tbl_001_NewKVG ON Tbl_001_WholeBase.Key = Tbl_001_NewKVG.Key
WHERE   NOT Tbl_001_NewKVG.Key IS NULL  

| Tbl_001_WholeBase.ID | Tbl_001_WholeBase.Key | Tbl_001_NewKVG.ID | Tbl_001_NewKVG.Key |
|----------------------|-----------------------|-------------------|--------------------|
| 1                    | Hronic1               | 1                 | Hronic1            |
| 2                    | Hronic2               | 2                 | Hronic2            |
或者您可以从表中删除它:

DELETE DISTINCTROW Tbl_001_WholeBase.*
FROM    Tbl_001_WholeBase LEFT JOIN Tbl_001_NewKVG ON Tbl_001_WholeBase.Key = Tbl_001_NewKVG.Key
WHERE   NOT Tbl_001_NewKVG.Key IS NULL  

| ID       | Key      |
|----------|----------|
| #Deleted | #Deleted |
| #Deleted | #Deleted |
| 3        | Hronic3  |

使用
存在

DELETE FROM Tbl_001_WholeBase 
WHERE EXISTS (SELECT 1
              FROM Tbl_002_NewKVG
              WHERE Tbl_001_WholeBase.Key = Tbl_002_NewKVG.Key 
             );
或者在
中使用
而不使用
连接

DELETE FROM Tbl_001_WholeBase 
WHERE Tbl_001_WholeBase.Key IN (SELECT Tbl_002_NewKVG.Key
                                FROM Tbl_002_NewKVG
                               );

选择子查询中的特定列,而不是用子查询中的“输入后”操作符中的Tbl_001_WholeBase.KEY匹配的字段替换*符号。欢迎使用Stackoverflow。永远不要使用select*,除非这是您需要的。根据我的经验,这是最常见的数据库性能问题。
DELETE FROM Tbl_001_WholeBase 
WHERE Tbl_001_WholeBase.Key IN (SELECT Tbl_002_NewKVG.Key
                                FROM Tbl_002_NewKVG
                               );