加入显示的行数不正确

问题描述:

我不知道为什么这不起作用,我的第一张表dbo.tsoSalesAnalysis有799个月的699行,而我所要做的全部是ADD从使用custKey作为参考,使用简单联接的dbo.[slSalesOrderTable]。但是,它给了我所有超过40万行的表的所有行。 IT应该只返回699行+1新列(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' 
+1

你能张贴一些样本数据吗? – DVT

+10

我不认为你明白'JOINS'是如何工作的,如果你在每个'custKey'的'slSalesOrderTable'中有多行,那么你会在你的连接结果中得到那些多行 – Lamak

+0

我认为左连接会解决那,但它不。那我该如何解决呢? – Cesar

如果CustKeytsoSalesOrdersTable唯一的,那么我们会期望返回超过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

+0

嘿谢谢!我在你发布答案LOL之前解决了它,但我几乎有同样的事情。很好的解释! – Cesar

假设您没有其他方式来获取CustID,解决方案是简单地将DISTINCT关键字添加到查询中。

当然,如果您有销售订单表以外的客户查询表,那么这将不是必需的。

+1

使用DISTINCT可能过于昂贵。它还从't'中假设表达式的唯一性,因为DISTINCT会折叠“重复”行,这可能不是所希望的。 (顺便说一下......我没有低估这个答案,我只是在这里添加一条评论,以帮助未来的读者。)在某些情况下,添加DISTINCT是最合适的解决方案。对于这种情况,我会避免DISTINCT并使用不同的方法。 – spencer7593

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

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' 
+1

如果'slSalesOrderTable'中的每个'custKey'有多个行,我们就已经知道了这个错误 – Lamak

+0

您可以将其限制为1 – Maviles

+1

您不是 – Lamak