Поиск альтернативы для оператора WITH SQL, имеющего взаимозависимые временные таблицы - PullRequest
0 голосов
/ 16 октября 2019

Я работаю над огромной БД с множеством таблиц. У меня есть своего рода рабочая версия с оператором «; 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], но что мне делать? Есть ли легкое исправление? Или я на неправильном пути?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...