我在MS Access 2010中运行SQL代码时遇到困难。我想寻求帮助来检查和纠正它。
数据:
-两个名称分别为Tbl_001_WholeBase
和Tbl_002_NewKVG
的表
-它们已通过名为Key
问题:
我想从Tbl_001_WholeBase
中删除表Key
Tbl_002_NewKVG
的所有行
示例:
Tbl_001_WholeBase
ID Key
1 Hronic1
2 Hronic2
3 Hronic3
Tbl_002_NewKVG
ID Key
1 Hronic1
2 Hronic2
因此,我只想留在Tbl_001_WholeBase
中的第3条记录中,基本情况如下:
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语句以仅请求一个字段。
答案 0 :(得分:1)
在子查询中选择一个键,而不是(*)
DELETE
FROM Tbl_001_WholeBase
WHERE Tbl_001_WholeBase.KEY IN
(SELECT keyId
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)));
keyId
是您要删除行的列名或唯一键。
答案 1 :(得分:0)
使用LEFT JOIN
连接两个表。
这将返回联接左侧表中的所有记录,以及右侧表中的所有匹配记录。 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
为NULL,因此您可以从结果中忽略它:
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 |
答案 2 :(得分:0)
使用EXISTS
:
DELETE FROM Tbl_001_WholeBase
WHERE EXISTS (SELECT 1
FROM Tbl_002_NewKVG
WHERE Tbl_001_WholeBase.Key = Tbl_002_NewKVG.Key
);
或在没有IN
的情况下使用JOIN
:
DELETE FROM Tbl_001_WholeBase
WHERE Tbl_001_WholeBase.Key IN (SELECT Tbl_002_NewKVG.Key
FROM Tbl_002_NewKVG
);