хорошо, это главный вредитель, и я постараюсь быть кратким.
У меня есть две таблицы: Security и SecurityAudit. В таблице Audit хранится копия любых изменений в таблице Security, только если они были внесены.,SecurityId - это внешний ключ.Таким образом, самая последняя запись всегда находится в таблице безопасности, и если есть изменение, то она записывается в таблицу аудита, и ValidToDate устанавливается на дату, когда запись была действительной до
[Security](
[SecurityID] [bigint] IDENTITY(10000,1) NOT NULL,
[Security] [nvarchar](255) NOT NULL,
[ISIN] [nvarchar](20) NOT NULL,
[CountryOfIncID] [bigint] NOT NULL,
[SecurityTypeID] [bigint] NOT NULL,
[SubTypeID] [bigint] NOT NULL,
[ISQ] [bigint] NOT NULL,
[MemberStateID] [bigint] NULL,
[ManualOverride] [bit] NULL,
.Таблица аудита
[SecurityAudit](
[SecurityAuditID] [bigint] IDENTITY(10000,1) NOT NULL,
[SecurityID] [bigint] NOT NULL,
[Security] [nvarchar](255) NOT NULL,
[CountryOfIncID] [bigint] NOT NULL,
[SubTypeID] [bigint] NOT NULL,
[ISQ] [bigint] NOT NULL,
[MemberStateID] [bigint] NULL,
[ValidToDateID] [datetime] Not NULL
Поэтому моя проблема в том, что я хочу сейчас получить все ценные бумаги, которые были в игре в определенный момент времени.Это значит получить все ценные бумаги, которые никогда не имели изменений, из таблицы безопасности, а затем соответствующие ценные бумаги из таблицы аудита на тот момент времени.
Я думал, что сделаю это, используя CTE, а Union иЗвание, но я врезался в стену.Пока это выглядит так ...
With
cteAllSecurities (RowNum,SecurityID, Security, ISQ, CountryOfIncorporationID, ValidToDate)
AS
(
SELECT RowNum=row_number() OVER (Partition By Security order by ValidToDate desc),
sa.SecurityID, sa.Security, sa.ISQ, sa.CountryOfIncorporationID, CONVERT(varchar(30), sa.ValidToDate,106)
FROM
SecurityAudit sa
UNION
SELECT 0 as RowNum,
s.SecurityID, s.Security, s.ISQ, s.CountryOfIncorporationID, CONVERT(varchar(30), GetUtcDate(),106) as ValidToDate
FROM
Security s
)
SELECT RowNum, SecurityID, Security, ISQ, CountryOfIncorporationID, ValidToDate
FROM cteAllSecurities
order by securityid
Where row_number() = 1
, поэтому я объединяю таблицу Securites, которая имеет последнюю, с Audit, и даю им номер строки.Затем я надеялся получить все ценные бумаги с номером строки 0 и без дочерних записей ... т. Е. Счетчик детей 0 в таблице аудита и записях аудита, которые меньше даты, которую я ищу, и забратьверхний.
Итак, я так далеко.Я на правильном пути, готовлю это или просто планирую сойти с ума.Любая помощь будет принята с благодарностью.
С уважением, M