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