2010-08-27 59 views
0

我正在嘗試開發SQL Server 2005查詢,但此刻我不成功。我嘗試了所有我知道的方法,例如派生表,子查詢,CTE等,但我無法解決問題。我不會發布我在這裏試過,因爲它們涉及到很多其他的列和表的查詢,但我會嘗試用一個簡單的例子來說明這個問題:連接兩個表並使用第一個表列「過濾」第二個表的快速方法是什麼?

  • 有兩個表:PARTS_SOLDPARTS_PURCHASED。第一個包含銷售給客戶的產品,第二個包含從供應商處購買的產品。這兩個表包含了運動本身,包含日期相關聯的外鍵等

  • 這裏是簡化架構:

PARTS_SOLD

  • part_id
  • date
  • 其他欄

PARTS_PURCHASED

  • part_id
  • date
  • 等欄目

  • 我需要的是從PARTS_PURCHASED具有獨特的行加入每一行中PARTS_SOLD,選擇通過part_id和最大「date」,其中「date「等於PARTS_PURCHASED之前的」date「列。換句話說,我需要爲每件銷售此商品的活動收集該商品上次購買活動的一些信息。

本身的問題是,我沒有發現使用列「date」從PARTS_SOLD限制PARTS_PURCHASEDMAX(date)PARTS_SOLD表加入PARTS_PURCHASED表的方式。

我本來可以用光標來解決問題,但是每個表都有數百萬行,並且可能使用遊標或子查詢來評估每行的查詢,這將使得該過程非常慢。

+0

輸入法,你不會有一個直接關係在一個供應商訂購的數量和數量之間。當庫存不足時,庫存系統有一個重新訂貨點來自動訂貨 - 如果同一件商品有三份訂單,那麼供應商訂單將請求15件商品 - 查詢結果應如何反映這一點? – 2010-08-27 16:48:34

+0

在零件出售時能夠識別零件的最後一次購買事件的目的是什麼?是否確定銷售商品的成本?這可能有助於提出一個能夠得到你想要結果的工作解決方案。 – 2010-08-27 17:00:04

+0

@Adam:這是一個臨時查詢,用於識別用戶在購買項目時輸入的某些數據與用戶在銷售時輸入的日期之間的差異,並糾正這些差異。該應用程序有一個錯誤已被糾正,我們也需要糾正過去。 – IT2 2010-08-27 17:18:48

回答

0

我會把它拋棄在那裏,但它可能包含各種錯誤...因爲我不確定我理解你的問題,並且因爲我的SQL最多是......虛弱。話雖這麼說,我的想法是嘗試這樣的:

SELECT * FROM PARTS_SOLD 
INNER JOIN (SELECT part_id, max(date) AS max_date 
      FROM PARTS_PURCHASED 
      GROUP BY part_id) AS subtable 
    ON PARTS_SOLD.part_id = subtable.part_id 
     AND PARTS_SOLD.date < subtable.max_date 
+0

這可以獲取賣出後沒有任何購買的已售物品,而不是已售物品的最後一次購買日期。 – IT2 2010-08-27 18:22:05

1

也許下面將幫助:

SELECT S.* 
    FROM PARTS_SOLD S 
INNER JOIN (SELECT PART_ID, MAX(DATE) 
       FROM PARTS_PURCHASED 
       GROUP BY PART_ID) D 
    ON (D.PART_ID = S.PART_ID) 
WHERE D.DATE <= S.DATE 

分享和享受。

+0

這可以獲取出售後沒有任何購買的出售物品,而不是上次購買日期的出售物品。 – IT2 2010-08-27 18:22:26

3

你不會喜歡我的答案。您的數據庫設計不正確,這就是爲什麼您無法按照自己想要的方式獲取數據的原因。即使使用遊標,你也不會從中獲得好的數據。假設您在2010年5月31日購買了第1部分中的第5部分。假設在6月1日,您售出了第1部分中的第10部分。僅在日期匹配時,即使顯然不正確,部件可能在5月23日購買,有些可能在2008年7月19日購買。

如果您想知道哪個採購零件與哪個銷售零件相關,那麼您的數據庫設計應該包含PartPurchasedID作爲PartsSold的一部分記錄,並且這應該在購買時填充,而不是稍後在您有1,000,000條記錄進行排序時進行報告。

相關問題