SQL DELETE From with子查询语法错误

时间:2018-12-18 10:44:57

标签: sql database ms-access ms-access-2010


我在MS Access 2010中运行SQL代码时遇到困难。我想寻求帮助来检查和纠正它。

数据:
-两个名称分别为Tbl_001_WholeBaseTbl_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语句以仅请求一个字段。

3 个答案:

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