加入显示的行数不正确
我不知道为什么这不起作用,我的第一张表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'
如果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
。
嘿谢谢!我在你发布答案LOL之前解决了它,但我几乎有同样的事情。很好的解释! – Cesar
假设您没有其他方式来获取CustID,解决方案是简单地将DISTINCT关键字添加到查询中。
当然,如果您有销售订单表以外的客户查询表,那么这将不是必需的。
使用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'
你能张贴一些样本数据吗? – DVT
我不认为你明白'JOINS'是如何工作的,如果你在每个'custKey'的'slSalesOrderTable'中有多行,那么你会在你的连接结果中得到那些多行 – Lamak
我认为左连接会解决那,但它不。那我该如何解决呢? – Cesar