Обновить таблицу с помощью объединения и внутреннего запроса

#tsql #sql-update

#tsql #sql-обновить

Вопрос:

Я импортировал таблицу элементов, которая имеет недопустимые состояния. Вместо аббревиатуры состояния она содержит завершенное название состояния.

Приведенный ниже запрос действительно работает и извлекает элементы.Имя состояния и State.Сокращение :

 Connecticut CT
Maryland    MD
Massachusetts   MA
  

Теперь я пытаюсь написать и обновить команду, в которой я заменяю элементы.StateName с указанием состояния.Сокращение .

 UPDATE dbo.Members
SET memState = (SELECT s.stAbv FROM dbo.State AS s
JOIN Members AS m ON s.stName = m.memState )
WHERE memState NOT IN (SELECT s.stAbv FROM dbo.State AS s)
  

ОШИБКА: Подзапрос вернул более 1 значения. Это не разрешено, когда следует подзапрос =, !=, <, <= , >, >= или когда подзапрос используется как выражение.

Выполнение инструкции было завершено. Я понимаю, что ошибка говорит о том, что мой внутренний запрос возвращает несколько строк, поэтому он не может обновиться. Как мне заставить это работать?

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

1. У вас есть более одной строки состояния в dbo.State с одинаковым именем? Если вы это сделаете — не следует ли удалить тот или иной из них / пометить как удаленный — или привязать к определенной стране, если у вас в таблице есть штаты США, округа Великобритании и т.д.?

2. Приведенный ниже код сработал, ОБНОВИТЕ dbo.Members, УСТАНОВИТЕ memState = (ВЫБЕРИТЕ TOP 1 s.stAbv ИЗ dbo.State КАК s, ПРИСОЕДИНИТЕ членов КАК m К s.stName = m.memState ), ГДЕ memState ОТСУТСТВУЕТ (ВЫБЕРИТЕ s.stAbv ИЗ dbo.State КАК s)

3. Вы уверены, что это то, что вам нужно? Будет ли аббревиатура, возвращаемая TOP 1, аббревиатурой «правильного» состояния? Почему у вас в таблице > 1 состояния с определенным именем?

Ответ №1:

Я думаю, вы могли бы сделать это следующим образом:

 UPDATE m
SET memState = s.stAbv
FROM dbo.Members AS m
  INNER JOIN dbo.State AS s ON s.stName = m.memState
  

Не совсем уверен в вашем предложении WHERE, но, скорее всего, оно не требуется.

Ответ №2:

Вы не можете присвоить memState более 1 значения. Попробуйте ВЫБРАТЬ DISTINCT, чтобы объединить повторяющиеся значения в одно значение.