Как встроить выбор в где в SQL доступ - PullRequest
0 голосов
/ 22 января 2020

Я пытаюсь вставить результат оператора SELECT в IIF, чтобы изменить значение другого столбца, и у меня возникли некоторые трудности.

В псевдокоде, что я пытаюсь сделать:

FROM employees table select Employee IDs and their Teams
FROM employee_locations table select Locations
WHERE an employee in employee table is found in the employee_locations table, and the employee's Team is blank, retrieve their Location
IIF their location is 'USA', change the Team field for that employee to 'Data Ops'
IIF their location is 'Germany', change the Team field for that employee to 'Sales'

Я не могу понять, почему это не работает по крайней мере для первого ИИФ ():

SELECT e.[ID], e.[Team]
(
select IIF(min(l.[location])='USA', e.[Team]='Data Ops')
FROM employee_locations as l
WHERE e.ID = l.ID AND e.Team is NULL
) as Location
FROM [employees] as e

1 Ответ

0 голосов
/ 22 января 2020

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

Я бы создал новую временную таблицу для хранения сопоставлений между местоположением и командой, а также включил бы ее в запрос, чтобы он выбирал новое значение команды в зависимости от местоположения.

Следующее SQL будет делать это:

UPDATE (employee_locations RIGHT JOIN employees ON employee_locations.employee = employees.ID) 
LEFT JOIN tbl_Temp ON employee_locations.location = tbl_Temp.location 
SET employees.Team = tbl_Temp.updateTeam
WHERE (((employees.Team) Is Null));

Временной таблице просто нужны два поля ("location" и "updateTeam" в моем примере) с двумя записями: (USA, Data Ops) и (Germany, Продажи ). Вы можете удалить временную таблицу после выполнения запроса.

Вы можете скопировать / вставить эту SQL в построитель запросов (несмотря на обновления, соответствующие вашим собственным таблицам / схемам), а затем нажмите «Просмотр» ( не «Выполнить») для предварительного просмотра, какие / сколько записей будут обновляться при нажатии «Выполнить».

ОБНОВЛЕНИЕ:

Чтобы сделать это без временной таблицы, вы можете использовать Формула в SQL, чтобы выполнить сопоставление следующим образом:

UPDATE employee_locations 
RIGHT JOIN employees ON employee_locations.employee = employees.ID 
SET employees.Team = IIf([location]='USA','Data Ops',IIf([location]='Germany',"Sales'",Null))
WHERE (((employees.Team) Is Null));

Но это станет утомительным (и, несомненно, медленным для выполнения) по сравнению с временной таблицей сопоставления.

ОБНОВЛЕНИЕ II:

UPDATE employee_locations 
RIGHT JOIN employees ON employee_locations.employee = employees.ID 
SET employees.Team = 'Data Ops'
WHERE employees.Team Is Null AND employees.location = 'USA';

Это немного более чистый запрос на обновление, но вам нужно будет запускать варианты выполнения для каждого сопоставления, которое вы хотите создать.

...