2009-09-28 11 views
0

我有一個交易表(transId,Sn,customerId,日期)列出客戶之間的項目交易。某些項目具有sn(序列號)並從一個客戶到另一個客戶。對於某些客戶(12345678),我需要找出誰是客戶物品的最後一位以前的所有者。如何在sql表中獲取以前的所有者?

這裏是我的查詢:

SELECT c.*, 
      p.transId, 
      p.customerId 
    FROM Transaction c 
LEFT JOIN Transaction p ON c.sn = p.sn 
    WHERE p.transId = (SELECT MAX(t.transId) 
         FROM Transaction t 
         WHERE t.transId < c.transId 
          AND t.sn = c.sn) 
    AND c.customerId = 12345678 
ORDER BY p.transId; 

此查詢的工作除了當項目沒有以前的主人罰款。應該爲p.transId和p.customerId返回空值,但是insead會返回0行。數據庫是訪問

更新:我需要有BOTH當前所有者和結果以前的主人(一行)。而且,它應該適用於中間所有者(如日誌;如果客戶不是當前所有者,而是以前是所有者)。

UPDATE:對於某些客戶(這將作爲參數傳遞;在我們的情況下,客戶ID = 12345678),我需要看到的是他曾經擁有的所有項目和項目的最後一個前業主的名單(從哪個客戶那裏獲得物品)。

一些更多的解釋:

  • TRANSID是一個主鍵和自動編號(標識) - 以前的主人將有小TRANSID較新的所有者
  • 客戶ID的交易是交易後買方(新主人)
  • 日期不包含時間;只有日期(不應該因爲一些項目比較或排序中使用可以改變在一天兩位業主)

這裏是一個小例子,這將使事情變得更加清晰的(未顯示日期):

 
     transaction table 
     ----------------------- 
     |transId|sn|customerId| 
     |  1| 1| 12345678| 
     |  2| 2| 87654321| 
     |  3| 2| 12345678| 
     |  4| 2| 11223344| 
     |  5| 2| 12345678| 
     ----------------------- 

     for customerId=12345678 result should be 

     result 
     -------------------------------------------------- 
     |transId|sn|customerId|prevTransId|prevCustomerId| 
     |  1| 1| 12345678|  NULL|   NULL| 
     |  3| 2| 12345678|   2|  87654321| 
     |  5| 2| 12345678|   4|  11223344| 
     -------------------------------------------------- 
從WHERE子句到JOIN條件(和你沒有在任何情況下需要 c.sn = p.sn)的 p.transId = ...
+0

你要麼得到了嚴重的措辭功課,或者您還沒有轉播的問題不夠準確。是否「對於customerID 12345678曾經擁有的任何項目(sn),找到我擁有該項目的當前所有者(customerID) - 可能不再是customerID 12345678 - 以及任何其他擁有該項目的人」?這與「中間所有者」是一致的。還是「找到我當前的所有者(不一定是customerID 12345678),並且將*片段賣給了customerID 12345678'的所有者?這是一個討厭的查詢,並不包括中間所有者。 – 2009-09-30 02:12:59

+0

......或者......好吧,還有其他可能的解釋。另一個問題:交易表記錄是誰出售了該商品或誰購買了它(並且,如果記錄出售商品和誰購買了商品,那麼記錄是否會更加正常)?此外,日期列的粒度是多少?它是記錄年/月/日還是包括時間?單個項目可以在單一日期多次出售(可能不包括時間;可能只包括年/月/日)?我們是否有權假定transID隨時間單調增加? – 2009-09-30 02:16:34

+0

如果您需要的是曾經擁有customerID 12345678曾經擁有的物品的任何人的客戶ID,那麼即使您想知道其他客戶擁有的物品的SN,也不會太難。 – 2009-09-30 02:20:23

回答

0

運動狀態:

普通SQL:

SELECT c.*, 
      p.transId, 
      p.customerId 
    FROM Transaction c 
LEFT JOIN Transaction p 
     ON p.transId = (SELECT MAX(t.transId) 
         FROM Transaction t 
         WHERE t.transId < c.transId 
          AND t.sn = c.sn) 
    WHERE c.customerId = 12345678 
ORDER BY p.transId; 

MS SQL訪問:

SELECT  c.*, 
      p.transId, 
      p.customerId 
FROM  Transaction c 
LEFT JOIN ((SELECT t.transId, MAX(z.transId) AS PrevTransId 
      FROM Transaction t 
      LEFT JOIN Transaction z on t.sn = z.sn 
      WHERE z.transId < t.transId 
      GROUP BY t.transId) x 
LEFT JOIN Transaction p ON p.TransId = x.PrevTransId 
      ) ON x.TransId = c.TransId 
WHERE  c.customerId = 12345678 
ORDER BY p.transId; 
+0

我試過(之前和現在再次),但Access報告:「查詢表達式中的語法錯誤'p.transId =(SELECT MAX(t.transId)...'。 – 2009-09-30 11:00:55

+0

@BB:added MS - 訪問版本 - brrrr,醜。 – van 2009-09-30 11:57:57

+0

它的工作! 謝謝你這麼多! – 2009-09-30 12:27:21

相關問題