我有一个非常复杂的嵌套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
很难用语言解释我要做什么。这是我正在尝试的图形: