2008-09-24 4 views
-1

Я хочу индексировать этот вид, но потому, что он имеет подзапрос i cant index. Может ли кто-нибудь предложить, как изменить это представление, чтобы я мог его индексировать.Как я могу изменить этот вид?

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 

ответ

3

Я не могу запустить его (очевидно), но что об этом ?:

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 ') против «NOT IN».

Удачи.

0

По крайней мере, в Oracle вы можете перейти с VIEW на MATERIALIZED VIEW. Будет рассмотрено несколько других проблем, таких как табличное пространство и методы синхронизации, но это может стоить изучить.

В зависимости от вашего приложения другим вариантом будет создание обычной таблицы на основе выбора этого представления и либо обновление ее с допустимым интервалом, либо использование большого количества внешних ключей.

Что наиболее практичным, зависит от целого ряда факторов - размера таблицы, частота обновлений, необходимо для большинства текущих данных и т.д.

+0

Я использую sql 2005 и iam, создавая представление для ежемесячного отчета о согласовании. Это всего лишь часть запроса и ям, имеющих союзы, чтобы присоединиться к другим частям .. он возвращает 1 МБ. – jbcedge 2008-09-24 22:28:17

0

Эта форма позволит использовать индекс на StreetSaleRcpt для каждого Publication_Master строки:

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 

 Смежные вопросы

  • Нет связанных вопросов^_^