SQL DELETE From с ошибкой синтаксиса подзапроса - PullRequest
0 голосов
/ 18 декабря 2018


У меня проблемы с запуском кода SQL в MS Access 2010. Я хотел бы попросить помощи в его просмотре и исправлении.

Данные:
- дватаблицы с именами: 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.

Ошибка при выполнении этого кода:

Вы написали подзапрос, который может возвращать более одного поля без использования зарезервированного слова Exists впредложение FROM основного запроса.Измените оператор SELECT подзапроса, чтобы запросить только одно поле.

Ответы [ 3 ]

0 голосов
/ 18 декабря 2018

Соедините две таблицы, используя 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  |
0 голосов
/ 18 декабря 2018

Используйте 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
                               );
0 голосов
/ 18 декабря 2018

Выберите ключ в подзапросе вместо (*)

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 будет вашим именем столбца или вашим уникальным ключом, с помощью которого вы хотите удалить строку.

...