首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >重写SQL查询以简化逻辑

重写SQL查询以简化逻辑
EN

Stack Overflow用户
提问于 2014-03-17 07:19:00
回答 1查看 98关注 0票数 2

我在优化查询方面还是个新手。这将是我第一次处理其他人的查询,并优化它以提高性能。请您给我建议,我可以简化查询的哪一部分,以提高它的性能.

代码语言:javascript
运行
复制
CREATE FUNCTION SALES  
   (@SUPPLIERCODE VARCHAR(15),  
    @BATCHID VARCHAR(50))  
RETURNS  
    @STOCKDETAILS TABLE([ID] CHAR(1),  
                        [BATCH RECEIVEDATE] DATETIME,  
                        SUPPLIERCODE VARCHAR(15),  
                        [NOW - RECEVEDATE] INT,  
                        [DUEDATE] VARCHAR(50)  
                       )  
AS  
BEGIN  
    DECLARE @RECEIVEDATE DATETIME,  
            @SUPPLIERCODE1 VARCHAR(15)  

    SELECT TOP 1  
        @RECEIVEDATE = O.ReceivedDate,  
        @SUPPLIERCODE1 = A.SUPPLIERCODE  
    FROM 
        TRANSACT.dbo.FIELDS A WITH(NOLOCK)  
    INNER JOIN 
        TRANSACT.dbo.DELIV O WITH(NOLOCK) ON O.BATCHID = A.BATCHID  

    DECLARE @ID1 TABLE(SUPPLIERCODE VARCHAR(50))  

    INSERT INTO @ID1  
        SELECT P.SUPPLIERCODE  
        FROM  
            (SELECT  
                 [SUPPLIERCODE] = SUPPLIERCODE,  
                 [TOTAL] = ISNULL(SUM(ITEMPRICE + (ITEMPRICE * .12)), 0)  
             FROM TRANSACT.dbo.ProviderDiscount WITH(NOLOCK)  
             WHERE ACQUIREDDATE <> '1900-01-01 00:00:00.000'  
               AND SUPPLIERCODE = @SUPPLIERCODE1  
             GROUP BY SUPPLIERCODE) P  
        WHERE P.TOTAL <> 0  

    DECLARE @ID TABLE ([BATCH RECEIVEDATE] DATETIME,  
                       SUPPLIERCODE VARCHAR(15),  
                       ACQUIREDDATE DATETIME,  
                       Coverage VARCHAR(20),  
                       CoverageItem VARCHAR(10),  
                       [NOW - RECEVEDATE] INT,  
                       DiscTerm1 INT, DiscTerm2 INT,
                       DiscTerm3 INT, DiscTerm4 INT,
                       DiscTerm5 INT,  
                       [NEW ACQUIREDDATE] VARCHAR(50)  
                      )  

    INSERT INTO @ID  
        SELECT DISTINCT  
            [BATCH RECEIVEDATE] = @RECEIVEDATE,  
            B.SUPPLIERCODE,  
            B.ACQUIREDDATE,  
            B.Coverage,  
            B.CoverageItem,  
            [NOW - RECEVEDATE] = DATEDIFF(DAY,@RECEIVEDATE,GETDATE()),  
            B.DiscTerm1, B.DiscTerm2, B.DiscTerm3,
            B.DiscTerm4, B.DiscTerm5,  
            [NEW ACQUIREDDATE] = TRANSACT.dbo.fxnGetIDNewACQUIREDDATE(B.DiscTerm1, B.DiscTerm2, B.DiscTerm3, B.DiscTerm4, B.DiscTerm5, @RECEIVEDATE)  
        FROM 
            TRANSACT.dbo.ProviderDiscount B WITH(NOLOCK)  
        INNER JOIN  
            (SELECT  
                 [ACQUIREDDATE] = MAX(ACQUIREDDATE),  
                 [REOD] = MAX(REOD)  
             FROM 
                 TRANSACT.dbo.ProviderDiscount B2 WITH(NOLOCK)  
             INNER JOIN 
                 @ID1 B1 ON B1.SUPPLIERCODE = B2.SUPPLIERCODE  
             WHERE 
                 B2.Coverage = @CLAIMTYPE  
                 AND B2.ACQUIREDDATE < @RECEIVEDATE) B3 ON B3.REOD = B.REOD  

       INSERT INTO @STOCKDETAILS  
           SELECT DISTINCT  
               [ID] = 'Y',  
               [BATCH RECEIVEDATE],  
               SUPPLIERCODE,  
               [NOW - RECEVEDATE],  
               [DUEDATE] = MIN([NEW ACQUIREDDATE])  
           FROM 
               @ID  
           WHERE 
               ISNULL([NEW ACQUIREDDATE],'NONE') <> 'NONE'  
           GROUP BY 
               [BATCH RECEIVEDATE], SUPPLIERCODE, [NOW - RECEVEDATE]  

    RETURN  
END
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-18 20:48:46

好吧,有一件事你可以做。

代码语言:javascript
运行
复制
 DECLARE @ID1 TABLE(SUPPLIERCODE VARCHAR(50))  
 INSERT INTO @ID1  
 SELECT P.SUPPLIERCODE  
 FROM  
 (  
  SELECT  
   [SUPPLIERCODE] = SUPPLIERCODE,  
   [TOTAL] = ISNULL(SUM(ITEMPRICE+(ITEMPRICE*.12)),0)  
  FROM TRANSACT.dbo.ProviderDiscount WITH(NOLOCK)  
  WHERE ACQUIREDDATE <> '1900-01-01 00:00:00.000'  
   AND SUPPLIERCODE = @SUPPLIERCODE1  
  GROUP BY SUPPLIERCODE  
 ) P  
 WHERE P.TOTAL <> 0  

可以重写掉很多额外的东西。也许比我在这里做的还要多:

代码语言:javascript
运行
复制
 DECLARE @ID1 TABLE(SUPPLIERCODE VARCHAR(50))  

 INSERT INTO @ID1  
 SELECT SUPPLIERCODE 
   FROM TRANSACT.dbo.ProviderDiscount WITH(NOLOCK)  
  WHERE ACQUIREDDATE <> '1900-01-01 00:00:00.000'  
    AND SUPPLIERCODE = @SUPPLIERCODE1  
  GROUP BY SUPPLIERCODE  
 HAVING ISNULL(SUM(ITEMPRICE),0) <> 0

这看起来几乎像重构SQL的测试问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22448730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档