加入不显示正确的行数

时间:2016-08-22 18:45:53

标签: sql sql-server

我不知道为什么这不起作用,我的第一个表dbo.tsoSalesAnalysis在7月份有699行,而我想要做的就是 ADD 来自使用dbo.[slSalesOrderTable]作为参考的简单联接custKey。但是,它为我提供了另一个表超过400,000行的所有行。它应该只返回699行+一个新列(CustID

SELECT 
    t.ItemKey,
    S.CustID,
    t.PostDate, t.ReturnAmt, t.ReturnsQty,
    t.SalesAmt, t.SalesQty, t.TranDate
FROM 
    [dbo].[tsoSalesAnalysis] AS t
INNER JOIN
    [dbo].[slSalesOrderTable] AS s ON t.CustKey = s.CustKey 
WHERE 
    t.PostDate >= '2016-07-01' 
    AND t.CustKey = '58888'

3 个答案:

答案 0 :(得分:1)

如果CustKey中的tsoSalesOrdersTable不唯一,那么我们预计会返回超过699行。

理想情况下,您可以使用不同的表(CustKey作为UNIQUE列)来查找CustId的值。如果没有,您可以使用内联视图从tsoSalesOrdersTable中获取单个值。例如:

  SELECT t.ItemKey
       , S.CustID
       , t.PostDate
       , t.ReturnAmt
       , t.ReturnsQty
       , t.SalesAmt
       , t.SalesQty
       , t.TranDate
    FROM [dbo].[tsoSalesAnalysis] t
    JOIN ( -- inline view to return one row for CustKey
           SELECT ms.CustKey
                , MIN(ms.CustId) AS CustId
             FROM [dbo].[slSalesOrderTable] ms
            WHERE ms.CustKey= '58888'
            GROUP BY ms.CustKey
         ) s
      ON s.CustKey = t.CustKey 
   WHERE t.PostDate >= '2016-07-01'

如果CustKey 58888的指定值未出现在slSalesOrderTable中,则内联视图将返回零行。这意味着由于内部联接,查询将返回零行。

如果您选择使用外部联接,那么您还希望在外部查询上包含t.CustKey上的谓词。

答案 1 :(得分:0)

这非常耗费资源,但您的数据库看起来并不大。

SELECT 
  t.ItemKey
  ,t.PostDate
  ,t.ReturnAmt
  ,t.ReturnsQty
  ,t.SalesAmt
  ,t.SalesQty
  ,t.TranDate
  ,(SELECT TOP 1 s.CustID FROM [dbo].[slSalesOrderTable] s WHERE t.CustKey = s.CustKey) as CUSTID
FROM [dbo].[tsoSalesAnalysis] as t
WHERE t.PostDate >= '2016-07-01' and t.CustKey= '58888'

答案 2 :(得分:-1)

假设您没有其他方法可以获取CustID,解决方案是只需将DISTINCT关键字添加到查询中。

当然,如果你有一个除了销售订单表之外的客户查询表会更好,但这不是必需的。