Вот как я бы go упорядочил в подзапросе, это не дает результирующий набор, который вы ищете (ваш исходный запрос также не выдает фактический результат из предоставленного набора данных), но это это метод, который я бы использовал для решения этой проблемы.
create table #temp (id int, name char(5), zip char(5), city char(5));
declare @table_a table (id int, name char(5), city char(5), zip char(5), mdate datetime);
insert @table_a
values(10001, 'Sarah', NULL, NULL, '02-20-2018 00:10:40:000'),
(98765, 'AJ', NULL, 'Asia', '03-25-2018 10:10:45:000'),
(12345, NULL, 7511, 'Texas', '03-20-2018 22:10:00:000');
declare @table_b table (id int, rollno int, Cdate datetime);
insert @table_b ( ID, RollNo, Cdate)
values
(12345, 1, '01-18-2018'),
(12345, 2, '01-22-2018'),
(12345, 3, '03-20-2018'),
(98765, 9, '01-18-2018'),
(98765, 8, '01-22-2018'),
(98765, 7, '03-20-2018'),
(10001, 10, '03-08-2018'),
(10001, 11, '01-15-2018'),
(10001, 12, '02-20-2018');
declare @table_c table ( rollno int, name char(5), city char(5), zip char(5),mdate datetime);
insert @table_c( Rollno, Name, Zip, City, Mdate)
values
(1, NULL, 7511, 'Texas', '01-18-2018 15:10:00:000'),
(2, 'John', 5001, NULL, '01-22-2018 10:05:00:000'),
(3, NULL, 7000, 'Rome', '03-20-2018 22:10:00:000'),
(10, 'Sarah', NULL, NULL, '03-08-2018 01:00:20:000'),
(11, 'Tom', 5500, NULL, '01-15-2018 15:10:00:000'),
(12, NULL, 4500, 'Pune', '02-20-2018 00:10:40:000'),
(9, 'AJ', NULL, 'Asia', '01-18-2018 23:01:02:000'),
(8, 'MATT', NULL, 'Ohio', '01-22-2018 20:00:05:000'),
(7, NULL, 8000, NULL, '03-25-2018 10:10:45:000');
declare @count int = coalesce((select count(*) from #temp), 100);
--Update t SET t.Name = C.name,
--t.Zip = C.ZIP,
--t.City=C.city
select *
FROM
(
SELECT top (@count) A.ID,
CASE
WHEN MAX(A.Name) IS NULL THEN MAX(C.Name)
ELSE Max(A.Name)
END Name,
CASE
WHEN MAX(A.Zip) IS NULL THEN Max(C.Zip)
ELSE MAX(A.Zip)
END Zip,
CASE
WHEN MAX(A.City) IS NULL THEN Max(C.City)
ELSE MAX(A.City)
END City,
A.Mdate
FROM @table_a A
INNER JOIN @Table_B B ON A.ID = B.ID
INNER JOIN @table_c C ON B.RollNo = C.RollNo
GROUP BY A.ID,A.Mdate
order by A.Mdate
) C
drop table #temp;
Если вам нужно упорядочить Mdate в производной таблице C, я бы использовал переменную, построенную из числа строк которую вы хотите обновить в таблице #temp, чтобы заполнить оператор top в вашем подзапросе. Таким образом, вы можете контролировать порядок.