Я пытаюсь выяснить различия между двумя таблицами (IAM и IAM_audit) для даты последнего изменения для множества полей Audit_fields (около 20). Я просто показываю два поля aud_fields здесь. Если я использую курсоры, это медленно. Вот пример двух столбцов. Пожалуйста, помогите мне, как создать один динамический запрос вместо того, чтобы давать результаты вместе? Большое спасибо!
Создание таблицы:
create table #Iam
(
Accnum int,
invnumber int,
name varchar(10),
Ac_status varchar(10)
)
insert into #Iam (Accnum, invnumber, name, Ac_status)
values (120, 131, 'abc', 'A'), (121, 132, 'def', 'C')
create table #Iam_audit
(
accnum int,
invnumber int,
audit_field varchar(10),
field_after varchar(10),
modified_date datetime
)
insert into #Iam_audit (accnum, invnumber, audit_field, field_after, modified_date)
values (120, 131, 'name', 'abd', '2014-08-09'),
(121, 132, 'ac_status', 'A', '2015-07-09'),
(120, 131, 'name', 'def', '2014-09-15'),
(121, 132, 'ac_status', 'A', '2015-09-14')
Отдельные запросы:
SELECT
a.invnumber, a.Accnum,
i.audit_field, i.field_after, name, i.maxdate AS Modified_date
FROM
#Iam a
JOIN
(SELECT
a.invnumber, a.Accnum, a.field_after, audit_field, maxdate
FROM
#Iam_audit a WITH(nolock)
INNER JOIN
(SELECT
Accnum, invnumber, MAX(Modified_Date) AS maxdate
FROM
#Iam_audit a2 WITH(nolock)
WHERE
a2.Audit_field = 'name'
GROUP BY
Accnum, invnumber) AS aa ON aa.Accnum = a.Accnum
AND aa.invnumber = a.invnumber
AND aa.maxdate = a.modified_Date
WHERE
a.Audit_Field = 'name') i ON i.audit_field = 'name'
AND i.Accnum = a.Accnum
AND i.invnumber = a.invnumber
AND a.name <> i.field_after
SELECT a.invnumber,a.Accnum,i.audit_field,i.field_after,ac_status,i.maxdate as Modified_date
FROM #Iam a
JOIN (Select a.invnumber,a.Accnum, a.field_after,audit_field,maxdate
from #Iam_audit a(nolock)
inner join (Select Accnum,invnumber, max(Modified_Date) as maxdate
from #Iam_audit a2(nolock)
where a2.Audit_field='ac_status'
group by Accnum,invnumber
) as aa on aa.Accnum = a.Accnum and aa.invnumber=a.invnumber and aa.maxdate=a.modified_Date
where a.Audit_Field='ac_status') i
ON i.audit_field='ac_status' and i.Accnum=a.Accnum and i.invnumber=a.invnumber AND a.name<>i.field_after