比较SQL Server中两个表的最有效方法

时间:2014-04-09 16:00:00

标签: sql sql-server

所以我有两张表来存储产品的销售数据。表1列出了每种产品的最近6周销售数据,表2显示了过去12个月的销售数据。我需要找到一种比较这两个表然后生成第3个表的方法,该表将包含作为第2列的2个值与第1列中的产品Sage代码之间的差异。什么是最有效(在时间上)的方式来做这个,因为将有相当数量的产品进行比较,它只会继续增长?产品Sage代码是此处的密钥标识符。这两个表创建如下。

    IF OBJECT_ID('tempdb..#Last6WeeksProductSales') IS NOT NULL DROP TABLE #Last6WeeksProductSales;

   CREATE TABLE #Last6WeeksProductSales
   (
        CompoundSageCode varchar(200),
        Value decimal(18,2)
   )

    INSERT INTO #Last6WeeksProductSales  
    SELECT      [SalesOrderLine].[sProductSageCode] AS [CompoundSageCode],
                SUM([SalesOrderLine].[fQtyOrdered] * [SalesOrderLine].[fPricePerUnit]) AS [Value]   
    FROM        [SalesOrderLine]
    INNER JOIN      [SalesOrder] ON (SalesOrder.iSalesOrderID = SalesOrderLine.iSalesOrderID)
    WHERE       [SalesOrder].[dOrderDateTime] > DateAdd("ww", -6, CURRENT_TIMESTAMP)
    GROUP BYsProductSageCode;

    SELECT * FROM   #Last6WeeksProductSales
    ORDER BY    CompoundSageCode;

    IF OBJECT_ID('tempdb..#Last12MonthsProductSales') IS NOT NULL DROP TABLE #Last12MonthsProductSales;

    CREATE TABLE #Last12MonthsProductSales
    (
        CompoundSageCode varchar(200),
        Value decimal(18,2)
    )

    INSERT INTO #Last12MonthsProductSales  SELECT   [SalesOrderLine].[sProductSageCode] AS [CompoundSageCode],
            SUM([SalesOrderLine].[fQtyOrdered] * [SalesOrderLine].[fPricePerUnit]) AS [Value]

    FROM    [SalesOrderLine]
    INNER JOIN [SalesOrder] ON (SalesOrder.iSalesOrderID = SalesOrderLine.iSalesOrderID)
    WHERE       [SalesOrder].[dOrderDateTime] > DateAdd(month, -12, CURRENT_TIMESTAMP)
    GROUP BY    sProductSageCode;

    SELECT * FROM#Last12MonthsProductSales
    ORDER BY    CompoundSageCode;

    DROP TABLE #Last6WeeksProductSales;
    DROP TABLE #Last12MonthsProductSales;

2 个答案:

答案 0 :(得分:1)

使用视图。这样您就不必担心更新第三个表,它将反映当前信息。将视图基于一个基本的SELECT:

SELECT sixS.CompoundSageCode, (12S.value - sixS.Value)为diffValue 来自Last6WeeksProductSales sixS INNER JOIN Last12MonthsProductSales12S ON sixS.CompoundSageCode = twelveS.CompoundSageCode

(我没有测试过这段代码,但它应该是一个很好的起点。)

答案 1 :(得分:0)

通常使用FULL OUTER JOIN来计算两个表的差异。 SQL Server可以使用所有三个物理连接运算符来实现它。应用合理的索引,运行正常。

如果可以管理它,请在两个表上创建覆盖索引,这些索引按连接键排序。这将导致高效的合并连接计划。