2016-08-22 79 views
1

我不知道爲什麼這不起作用,我的第一張表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

回答

1

如果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

-1

假設您沒有其他方式來獲取CustID,解決方案是簡單地將DISTINCT關鍵字添加到查詢中。

當然,如果您有銷售訂單表以外的客戶查詢表,那麼這將不是必需的。

+1

使用DISTINCT可能過於昂貴。它還從't'中假設表達式的唯一性,因爲DISTINCT會摺疊「重複」行,這可能不是所希望的。 (順便說一下......我沒有低估這個答案,我只是在這裏添加一條評論,以幫助未來的讀者。)在某些情況下,添加DISTINCT是最合適的解決方案。對於這種情況,我會避免DISTINCT並使用不同的方法。 – spencer7593

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

如果'slSalesOrderTable'中的每個'custKey'有多個行,我們就已經知道了這個錯誤 – Lamak

+0

您可以將其限制爲1 – Maviles

+1

您不是 – Lamak