CHill60
Согласно моему комментарию, при первом запуске эта задача должна быть назначена 004-PAT, поскольку в настоящее время им вообще не назначены никакие задачи.
Этот код будет делать то, что вы хотите:
UPDATE [tasks] SET AssignedTo =
(select TOP 1 idno
from [Master] M left outer join [tasks] T on M.idno=T.AssignedTo
group by idno
order by COUNT(t.taskID) )
WHERE AssignedTo IS NULL
Что нужно отметить:
- использование
TOP 1
чтобы получить только один idno
- Этот
ORDER BY
поэтому тот, у кого меньше всего назначений, фильтруется наверх
- Я пользовался таким столом
creeate table [tasks]
(
taskID int identity(1,1),
Task nvarchar(150),
AssignedTo int
)
- Обратите внимание на
WHERE
поэтому я обновляю только неназначенные записи
При первом запуске этого кода Вы можете получить предупреждение о нулевых значениях
Цитата:
Предупреждение: нулевое значение исключается агрегатом или другой операцией набора.
Это можно проигнорировать и не появится, как только всем записям в таблице [Master] будет назначена хотя бы одна задача
Чтобы быть ясным я использовал следующие тестовые данные
insert into [Master] values
('JAMES'), -- Id = 1 (Autogenerated)
('PAUL'), -- Id = 2
('MAY'), -- Id = 3
('PAT') -- Id = 4
insert into [tasks] values
('John Smith',1), -- assigned to JAMES
('Sarah Adams',1), -- assigned to JAMES
('Michael Jones',1), -- assigned to JAMES
('Godfred Arthur',2), -- assigned to PAUL
('David Lawson',2), -- assigned to PAUL
('Jennifer Bruce',3), -- assigned to MAY
('new item',null) -- assigned to NO-ONE!
Итак, отправной точкой является:
У Джеймса есть 3 задачи
У Павла есть 2 задачи
Май имеет 1 задание, назначенное
У Пэта нет для них никаких заданий.
На столе 7 заданий, все, кроме одного, кому-то назначены.
Экстраполируя приведенный выше код в этом разделе
--select TOP 1 idno
SELECT idno, name, count(t.taskID)
from [Master] M left outer join [tasks] T on M.idno=T.AssignedTo
group by idno, name
order by COUNT(t.taskID)
давать результат
4 PAT 0
3 MAY 1
2 PAUL 2
1 JAMES 3
Так что бит, который я на самом деле использовал
select TOP 1 idno
from [Master] M left outer join [tasks] T on M.idno=T.AssignedTo
group by idno
order by COUNT(t.taskID)
вернет значение
4
.
Это значение будет присвоено
все строки на столе, где
AssignedTo
столбец равен нулю.
Важно отметить, что, как и в вашем случае в комментариях, если ни одна строка не имеет нулевого значения в столбце AssignedTo, то
ничего не будет обновлено и подсчеты для каждой строки в главной таблице останутся неизменными
Если я добавлю новую строку
insert into tasks values ('item 2',null)
и запустите код снова, во второй раз, когда у Мэй и ПЭТ будет только по 1 задаче. Вполне вероятно, что может быть назначена новая задача просто потому, что этот идентификатор ниже, чем PAT, но это не гарантировано.
Member 12770648
создать таблицу [Ktasks]
(
taskid int identity (1,1),
Задача nvarchar(150),
Кому назначено инт
)
Вставить в [Ktasks] значения ('1', 'JOHN SMITH', 1)
Вставить в [Ktasks] значения ('1', 'SARAH ADAMS', 1)
Вставить в [Ktasks] значения('1','микрофон Джонса ,1)
Вставить в [Ktasks] значения ('1', 'GODFRED ARTHUR', 1)
Вставить в [Ktasks] значения ('1', 'DAVID LAWSON', 1)
Вставить в [Ktasks] значения ('1', 'JENNY BRUCE', 1)
создать таблицу [Master]
(
идно варчар(10),
имя варчар (15),
)
Вставить в основные значения ('0001', 'JAMES')
Вставить в основные значения ('0002', 'PAUL')
Вставить в основные значения ('0003', 'MAY')
Вставить в основные значения ('0004', 'PAT')
Обновление [Ktasks] SET AssignedTo =
(выбрать первые 1 идно
из [мастер] м левое внешнее соединение [Ktasks] Т О М. идно=т. кому назначено
группы идно
заказать по количеству(т. идентификатор_задачи) )
Где кому назначено значение null
выберите * из Ktasks