Использование SQL для вставки между таблицами с повторяющимися данными - PullRequest
1 голос
/ 10 января 2020

Мои данные структурированы следующим образом:

Table 1 - Employee</b>

-ID
-Name
-Address
-City
-State
...

Table 2 - Audit

-Address
-City
-State
...

Мне нужно вставить соответствующий идентификатор из таблицы сотрудников в таблицу аудита с помощью , соответствующего адрес, город и штат из таблицы аудита меньшего размера с информацией об адресе из таблицы сотрудников большего размера (при условии, что ни один из сотрудников не разделяет адрес)

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

Сообщение 512, уровень 16, состояние 1, строка 1 Подзапрос возвратил более 1 значения. Это недопустимо, если подзапрос следует =,! =, <, <=,>,> = Или когда подзапрос используется в качестве выражения.

UPDATE AuditTable SET employee_id = (
    SELECT e.employee_id 
    FROM EmployeeTable e 
    JOIN AuditTable a
        ON  e.address = a.address
        AND e.home_city = a.home_city
        AND e.home_st = a.home_st
)

Требуется один и тот же сотрудник могу повторить несколько раз в таблице аудита и по-прежнему показывать один и тот же идентификатор, что вызывает мои проблемы. Я уже пытался заменить = на IN и использовать TOP 1 в моем выборе Заявление, но не повезло получить то, что мне нужно.

Ответы [ 2 ]

2 голосов
/ 10 января 2020

Проблема с вашим запросом состоит в том, что подзапрос не коррелирует с обновляемой таблицей, следовательно, он генерирует несколько записей.

Если в таблице Employee нет дубликатов для кортежей (address, home_city, home_st), вы можете использовать простой коррелированный подзапрос:

UPDATE AuditTable SET employee_id = (
    SELECT e.employee_id 
    FROM EmployeeTable e 
    WHERE 
        e.address = AuditTable.address 
        AND e.home_city = AuditTable.home_city 
        AND e.home_st = AuditTable.home_st
)

Если возможны дубликаты, вы можете использовать TOP 1 или агрегатная функция, такая как MAX():

UPDATE AuditTable SET employee_id = (
    SELECT TOP 1 e.employee_id 
    FROM EmployeeTable e 
    WHERE 
        e.address = AuditTable.address 
        AND e.home_city = AuditTable.home_city 
        AND e.home_st = AuditTable.home_st
)
0 голосов
/ 10 января 2020

Использовать объединение:

UPDATE a
SET a.employee_id = e.employee_id
FROM AuditTable a INNER JOIN EmployeeTable e 
ON e.address = a.address AND e.home_city = a.home_city AND e.home_st = a.home_st
...