我不知道为什么这不起作用,我的第一个表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'
答案 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关键字添加到查询中。
当然,如果你有一个除了销售订单表之外的客户查询表会更好,但这不是必需的。