Упрощение сложного вложенного SQL View.Транспонировать и версионные данные - PullRequest
0 голосов
/ 01 июля 2019

У меня очень сложный (для меня, во всяком случае) вложенный SQL View. У меня есть несколько отдельных подразделов, которые почти все одинаковы. Я думаю, что мое мнение было бы намного более эффективным, если бы я мог объединить их в меньшее количество заявлений. По сути, я пытаюсь транспонировать данные в определенной таблице, но в таблицах также есть история изменений. Мне нужно сначала устранить все, кроме последней версии данных. Я только знаю, как сделать это по одному. Код, который я включил, является двумя из подвидов. Я хотел бы объединить их в одну точку зрения. Я надеюсь, что смогу добавить больше, когда пойму логику и контекст высказываний.

Один из видов.

Вид, который у меня есть, на самом деле работает отлично. Однако в некоторых случаях, в зависимости от приложения, вызывающего представление SQL, генерация результатов может занять несколько минут. Напомню, что я включил здесь лишь небольшую часть всего моего составного представления, но для простоты я публикую лишь небольшую его часть, которая должна решить 80% проблемы, если я смогу объединить представления.

SELECT DocumentID, VariableID, ExtensionID, Description, RevisionNo, CurrentStatusID, Date, TransitionNr, RevNr, LatestRevisionNo, Filename, Deleted
FROM     (SELECT dbo.VariableValue.DocumentID, dbo.VariableValue.VariableID, dbo.Documents.ExtensionID, dbo.VariableValue.ValueText AS PartNumber, dbo.VariableValue.RevisionNo, dbo.Documents.CurrentStatusID, 
                                    dbo.TransitionHistory.Date, dbo.TransitionHistory.TransitionNr, dbo.TransitionHistory.RevNr, dbo.Documents.LatestRevisionNo, dbo.Documents.Filename, dbo.Documents.Deleted, ROW_NUMBER() OVER (PARTITION BY 
                                    dbo.VariableValue.DocumentID
                  ORDER BY dbo.VariableValue.RevisionNo DESC, dbo.TransitionHistory.TransitionNr DESC) AS Seq
FROM     dbo.Documents INNER JOIN
                  dbo.VariableValue ON dbo.Documents.DocumentID = dbo.VariableValue.DocumentID INNER JOIN
                  dbo.TransitionHistory ON dbo.Documents.DocumentID = dbo.TransitionHistory.DocumentID
WHERE  (dbo.Documents.Deleted = 0) AND (dbo.Documents.ExtensionID = 3) AND (dbo.Documents.CurrentStatusID <> 0) AND (dbo.VariableValue.VariableID = 47)) t
WHERE  Seq = 1

Другое представление (обратите внимание только на то, что VariableID = "49" (AS Description) вместо "47" (AS PartNumber).

SELECT DocumentID, VariableID, ExtensionID, Description, RevisionNo, CurrentStatusID, Date, TransitionNr, RevNr, LatestRevisionNo, Filename, Deleted
FROM     (SELECT dbo.VariableValue.DocumentID, dbo.VariableValue.VariableID, dbo.Documents.ExtensionID, dbo.VariableValue.ValueText AS Description, dbo.VariableValue.RevisionNo, dbo.Documents.CurrentStatusID, 
                                    dbo.TransitionHistory.Date, dbo.TransitionHistory.TransitionNr, dbo.TransitionHistory.RevNr, dbo.Documents.LatestRevisionNo, dbo.Documents.Filename, dbo.Documents.Deleted, ROW_NUMBER() OVER (PARTITION BY 
                                    dbo.VariableValue.DocumentID
                  ORDER BY dbo.VariableValue.RevisionNo DESC, dbo.TransitionHistory.TransitionNr DESC) AS Seq
FROM     dbo.Documents INNER JOIN
                  dbo.VariableValue ON dbo.Documents.DocumentID = dbo.VariableValue.DocumentID INNER JOIN
                  dbo.TransitionHistory ON dbo.Documents.DocumentID = dbo.TransitionHistory.DocumentID
WHERE  (dbo.Documents.Deleted = 0) AND (dbo.Documents.ExtensionID = 3) AND (dbo.Documents.CurrentStatusID <> 0) AND (dbo.VariableValue.VariableID = 49)) t
WHERE  Seq = 1

Есть кто-нибудь на этом?

Спасибо.

Добавлено 01.07.2009: 13:37 CST

Мне нужно будет добавить еще несколько деталей. Нет, просто добавление дополнительного оператора OR для включения 47 и 49 не работает. Главным образом потому, что 47 окажется одним столбцом, а 49 - другим. Оба имели независимую последовательность RevisionNo для поиска MAX.

В нынешнем виде все используемые мной процедуры VIEW приводят к идеальным данным. Однако, в зависимости от того, как приложения вызывают VIEW, генерация результатов может занять более 3 минут. Я использовал В SQL Studio, когда я генерирую результаты в режиме «Дизайн», это занимает всего несколько секунд. Я заметил, что если я использовал какой-либо оператор TOP, то для получения результатов требуется несколько минут. Даже в студии. Я выложу несколько образцов данных.

Добавлено 01.07.2009: 15:18 CST

Трудно объяснить словами, что я пытаюсь сделать. Вот график того, что я пытаюсь сделать:

Показать визуальное описание этого поста.

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