Проблема с синтаксисом удаления в SQL — ошибка В списке выбора может быть указано только одно выражение, когда подзапрос не вводится с помощью EXISTS

#sql #sql-server #sql-delete

#sql #sql-server #sql-delete

Вопрос:

У меня есть этот SQL-запрос:

 SELECT NumeroReloj, Badgenumber, Name, lastname, DEFAULTDEPTID
FROM [PBS].[dbo].[CAT_Empleados]
RIGHT JOIN [AccessControl].[dbo].[USERINFO]
ON [PBS].[dbo].[CAT_Empleados].[NumeroReloj] = [AccessControl].[dbo].[USERINFO].[Badgenumber] COLLATE Chinese_PRC_CI_AS
WHERE [AccessControl].[dbo].[USERINFO].[Badgenumber] COLLATE Chinese_PRC_CI_AS NOT IN (SELECT [NumeroReloj] FROM [PBS].[dbo].[CAT_Empleados])
  

Существует 2 базы данных и 2 таблицы с разными именами.

С помощью этого запроса я получаю несколько пользователей, которые находятся в таблице [AccessControl].[dbo].[USERINFO] но их нет в таблице [PBS].[dbo].[CAT_Empleados].

Столбец Employee# для [AccessControl].[dbo].[USERINFO] называется ‘Badgenumber’, а столбец Employee# для [PBS].[dbo].[CAT_Empleados] называется ‘NumeroReloj’ (вот как совпадают оба результата).

Что ж, этот запрос работает нормально, и теперь я хочу удалить в [AccessControl].[dbo].[USERINFO] те же результаты, которые я получаю в этом запросе выбора. Я пытался с помощью:

 DELETE 
FROM [AccessControl].[dbo].[USERINFO] 
WHERE [AccessControl].[dbo].[USERINFO].[Badgenumber] IN (SELECT * FROM [PBS].[dbo].[CAT_Empleados] RIGHT JOIN [AccessControl].[dbo].[USERINFO] ON [PBS].[dbo].[CAT_Empleados].[NumeroReloj] = [AccessControl].[dbo].[USERINFO].[Badgenumber] COLLATE Chinese_PRC_CI_AS WHERE [AccessControl].[dbo].[USERINFO].[Badgenumber] COLLATE Chinese_PRC_CI_AS NOT IN (SELECT [NumeroReloj] FROM [PBS].[dbo].[CAT_Empleados])

  

Но я получаю это сообщение об ошибке:

Сообщение 116, уровень 16, состояние 1, строка 3 В списке выбора может быть указано только одно выражение, когда подзапрос не вводится с помощью EXISTS.

Ответ №1:

Проблема, с которой вы сталкиваетесь, заключается в том, что в вашем операторе удаления вы просите удалить только сотрудников с плохим номером в подзапросе, который возвращает несколько полей, обозначенных символом «*». Таким образом, SQL не знает, с чем вы хотите сравнить badgenumber.

Измените «*» в вашем подзапросе, чтобы оно соответствовало полю 1, то есть полю, которое вы хотите сравнить с badgenumber.

Комментарии:

1. Спасибо, alex067, это работает. Я только что изменил * для Badgenumber.