Я работаю над огромной БД с множеством таблиц. У меня есть своего рода рабочая версия с оператором «; WITH», но она имеет побочные эффекты для всей базы данных (иногда она останавливает или замедляет работу ETL), поэтому я ищу альтернативу.
Я попытался переписать запрос, но затем я получил
многоэлементный идентификатор x, который не может быть связан
, поскольку таблицы строятся на каждомпрочее.
Тип рабочей версии:
USE[database]
;WITH[table1] AS
(
SELECT [RegionList].[Cluster]
,[RegionList].[Region]
,[Customer]
,[Key1]
,[Key2]
,MAX(..[TimeK].) AS [Time]
FROM [table3]
JOIN [RegionList] ON [RegionList].[Region] = [DRegion].[Region]
JOIN [DTime] ON [table3].[TimeK] = [DTime].[TimeK]
JOIN [PKey] ON [table3].[Key2] = [PKey].[Key2]
GROUP BY [RegionList].[Cluster]
,[RegionList].[Region]
,[Customer]
,[Key1]
,[Key2]
)
,[table2] AS
(
SELECT [table3].[Name]
,[DProduct].[Product]
,[PKey].[Key2]
,CASE
WHEN [table1].[time] IS NULL THEN [DProduct].[Product]
WHEN ...
ELSE NULL
END AS [NotActive]
FROM [table1]
JOIN [DProduct] ON [table1].[Key1] = [DProduct].[Key1]
JOIN [PKey] ON [table3].[Key2] = [PKey].[Key2]
JOIN [Name] ON [table3].[Name] = [DName].[Name]
)
SELECT [table2].[NotActive]
,[table2].[Name]
,[tabel1].[Time]
,[table1].[Region]
FROM [table2]
JOIN [table1] ON [table1].[Key2] = [table2].[Key2]
WHERE [NotActive] IS NOT NULL
(необходим для изменения имен из данных, поэтому в случае ошибки это происходит из-за расшифровки)
Я хотел переписать его так, чтобы у меня было:
USE[database]
SELECT [table2].[NotActive]
,[table2].[Name]
,[tabel1].[Time]
,[table1].[Region]
FROM (
SELECT [RegionList].[Cluster]
,[RegionList].[Region]
,[Customer]
,[Key1]
,[Key2]
,MAX(..[TimeK].) AS [Time]
FROM [table3]
JOIN [RegionList] ON [RegionList].[Region] = [DRegion].[Region]
JOIN [DTime] ON [table3].[TimeK] = [DTime].[TimeK]
JOIN [PKey] ON [table3].[Key2] = [PKey].[Key2]
GROUP BY [RegionList].[Cluster]
,[RegionList].[Region]
,[Customer]
,[Key1]
,[Key2]
) AS [table1],
(
SELECT [table3].[Name]
,[DProduct].[Product]
,[PKey].[Key2]
,CASE
WHEN [table1].[time] IS NULL THEN [DProduct].[Product]
WHEN ...
ELSE NULL
END AS [NotActive]
FROM [table1]
JOIN [DProduct] ON [table1].[Key1] = [DProduct].[Key1]
JOIN [PKey] ON [table3].[Key2] = [PKey].[Key2]
JOIN [Name] ON [table3].[Name] = [DName].[Name]
) AS [table2]
WHERE [NotActive] IS NOT NULL
Но теперь во второй части оператора есть ошибка «идентификатор из нескольких частей [table1] не может быть связан». Я знаю, что в этой части он не «видит» [table1], но что мне делать? Есть ли легкое исправление? Или я на неправильном пути?