#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.