我怎样才能改变这种看法?
时间:2020-03-06 14:41:29 来源:igfitidea点击:
我想索引此视图,但因为它有子查询,所以我无法索引。任何人都可以建议如何更改此视图,以便我可以对其进行索引。
ALTER VIEW [dbo].[Recon2] WITH SCHEMABINDING AS SELECT dbo.Transactions.CustomerCode, dbo.Customer_Master.CustomerName, dbo.Transactions.TransDate, dbo.Transactions.PubCode, dbo.Transactions.TransType, dbo.Transactions.Copies, SUM(dbo.Transactions.TotalAmount) AS TotalAmount, '0' AS ReceiptNo, '2008-01-01' AS PaymentDate, 0 AS Amount, dbo.Transactions.Period, dbo.Transactions.Year, dbo.Publication_Master.PubName, dbo.Customer_Master.SalesCode, COUNT_BIG(*) AS COUNT FROM dbo.Publication_Master INNER JOIN dbo.Customer_Master INNER JOIN dbo.Transactions ON dbo.Customer_Master.CustomerCode = dbo.Transactions.CustomerCode ON dbo.Publication_Master.PubCode = dbo.Transactions.PubCode WHERE (dbo.Customer_Master.CustomerCode NOT IN (SELECT CustomerCode FROM dbo.StreetSaleRcpt WHERE (PubCode = dbo.Transactions.PubCode) AND (TransactionDate = dbo.Transactions.TransDate) AND (Updated = 1) AND (PeriodMonth = dbo.Transactions.Period) AND (PeriodYear = dbo.Transactions.Year))) GROUP BY dbo.Transactions.CustomerCode, dbo.Customer_Master.CustomerName, dbo.Transactions.TransDate, dbo.Transactions.PubCode, dbo.Publication_Master.PubName, dbo.Customer_Master.SalesCode, dbo.Transactions.[Update], dbo.Transactions.TransType, dbo.Transactions.Copies, dbo.Transactions.Period, dbo.Transactions.Year, dbo.Transactions.TotalAmount
解决方案
我不能(显然)运行它,但是呢?
SELECT dbo.Transactions.CustomerCode, dbo.Customer_Master.CustomerName, dbo.Transactions.TransDate, dbo.Transactions.PubCode, dbo.Transactions.TransType, dbo.Transactions.Copies, '0' AS ReceiptNo, '2008-01-01' AS PaymentDate, 0 AS Amount, dbo.Transactions.Period, dbo.Transactions.Year, dbo.Publication_Master.PubName, dbo.Customer_Master.SalesCode, dbo.StreetSaleRcpt.CustomerCode, SUM(dbo.Transactions.TotalAmount) AS TotalAmount, COUNT_BIG(*) AS COUNT FROM dbo.Publication_Master INNER JOIN dbo.Customer_Master ON dbo.Customer_Master.CustomerCode = dbo.Transactions.CustomerCode INNER JOIN dbo.Transactions ON dbo.Publication_Master.PubCode = dbo.Transactions.PubCode LEFT OUTER JOIN dbo.StreetSaleRcpt ON ( dbo.StreetSaleRcpt.PubCode = dbo.Transactions.PubCode AND dbo.StreetSaleRcpt.TransactionDate = dbo.Transactions.TransDate AND dbo.StreetSaleRcpt.PeriodMonth = dbo.Transactions.Period AND dbo.StreetSaleRcpt.PeriodYear = dbo.Transactions.Year AND dbo.StreetSaleRcpt.Updated = 1 AND dbo.StreetSaleRcpt.CustomerCode = dbo.Customer_Master.CustomerCode ) WHERE dbo.StreetSaleRcpt.CustomerCode IS NULL GROUP BY dbo.Transactions.CustomerCode, dbo.Customer_Master.CustomerName, dbo.Transactions.TransDate, dbo.Transactions.PubCode, dbo.Publication_Master.PubName, dbo.Customer_Master.SalesCode, dbo.Transactions.[Update], dbo.Transactions.TransType, dbo.Transactions.Copies, dbo.Transactions.Period, dbo.Transactions.Year, dbo.Transactions.TotalAmount, dbo.StreetSaleRcpt.CustomerCode
将相关的子查询设为左联接,并测试其是否不存在(" WHERE dbo.StreetSaleRcpt.CustomerCode IS NULL")与"否"。
祝你好运。
至少在Oracle中,我们可以从VIEW更改为MATERIALIZED VIEW。还有其他一些问题需要考虑,例如表空间和同步方法,但这可能值得探讨。
根据应用程序,另一个选择是根据此视图的选择创建一个普通表,并以可接受的时间间隔对其进行更新,或者使用大量外键。
最实际的选择取决于许多因素-表大小,更新频率,对最新数据的需求等。
该表格将允许在每个Publication_Master行上使用StreetSaleRcpt上的索引:
ALTER VIEW [dbo].[Recon2] WITH SCHEMABINDING AS SELECT dbo.Transactions.CustomerCode, dbo.Customer_Master.CustomerName, dbo.Transactions.TransDate, dbo.Transactions.PubCode, dbo.Transactions.TransType, dbo.Transactions.Copies, SUM(dbo.Transactions.TotalAmount) AS TotalAmount, '0' AS ReceiptNo, '2008-01-01' AS PaymentDate, 0 AS Amount, dbo.Transactions.Period, dbo.Transactions.Year, dbo.Publication_Master.PubName, dbo.Customer_Master.SalesCode, COUNT_BIG(*) AS COUNT FROM dbo.Publication_Master INNER JOIN dbo.Customer_Master INNER JOIN dbo.Transactions ON dbo.Customer_Master.CustomerCode = dbo.Transactions.CustomerCode ON dbo.Publication_Master.PubCode = dbo.Transactions.PubCode WHERE (NOT EXISTS (SELECT NULL FROM dbo.StreetSaleRcpt WHERE (PubCode = dbo.Transactions.PubCode) AND (TransactionDate = dbo.Transactions.TransDate) AND (Updated = 1) AND (PeriodMonth = dbo.Transactions.Period) AND (PeriodYear = dbo.Transactions.Year) ANMD (CustomerCode = dbo.Customer_Master.CustomerCode) ) ) GROUP BY dbo.Transactions.CustomerCode, dbo.Customer_Master.CustomerName, dbo.Transactions.TransDate, dbo.Transactions.PubCode, dbo.Publication_Master.PubName, dbo.Customer_Master.SalesCode, dbo.Transactions.[Update], dbo.Transactions.TransType, dbo.Transactions.Copies, dbo.Transactions.Period, dbo.Transactions.Year, dbo.Transactions.TotalAmount