简化复杂的嵌套SQL视图。转置和版本化数据

时间:2019-07-01 16:55:48

标签: sql sql-server

我有一个非常复杂的嵌套SQL视图(对我而言)。我有几个几乎都是相同的单独的子视图。我认为,如果我可以将它们合并为更少的陈述,那么我的观点将会更加有效。本质上,我试图将数据转置到特定表中,但是表中也有修订历史记录。我需要首先消除除最新修订数据以外的所有内容。我一次只知道该怎么做。我包含的代码是其中的两个子视图。我想将这些结合成一个视图。当我理解语句的逻辑和上下文时,可以希望再添加更多内容。

其中一种视图。

我的观点实际上很完美。但是,在某些情况下,取决于调用SQL View的应用程序,可能要花费几分钟才能生成结果。请注意,我在此处包含的内容只是整个复合视图的一小部分,但为简单起见,我只发布其中的一小部分,如果可以合并视图,则可以解决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描述)而不是“ 47”(AS部件号)。

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

有人参加吗?

谢谢。

添加了7/1/2019:CST下午13:37

我将需要添加更多细节。不,仅添加附加的OR语句以包含47和49无效。主要是因为47最终将成为一列,而49将成为另一列。两者都有独立的RevisionNo序列,也可以找到MAX。

就目前而言,我正在使用的整个VIEW例程可得出完美的数据。但是,根据应用程序调用VIEW的方式,可能要花费3分钟以上的时间才能生成结果。我在SQL Studio中使用过,当我在“设计”模式下生成结果时,只需要几秒钟。我确实注意到,如果我使用了任何种类的TOP语句,那么生成结果最多要花费几分钟。即使在Studio中。我将发布一些数据样本。

添加了7/1/2019:CST下午15:18

很难用语言解释我要做什么。这是我正在尝试的图形:

Show Visual Description of this post.

0 个答案:

没有答案