2009-07-10 30 views
0

我有一個表叫股票和另一個叫上市,內部庫存表是指示當事情是在庫存物品的隊列前面的狀態代碼 - 我希望能夠找到最近添加的項目,將其設置爲「隊列的前端」狀態。
例如把所有的物品列出,然後命令他們一個最近期上市 我會用這個查詢:如何將此查詢分組以使其行爲正確?

SELECT SKU FROM Stock 
INNER JOIN Listed 
ON Listed.ListingID = Stock.ListingID 
WHERE Stock.StatusCode = 2 
ORDER BY Listed.ListDate 

但是我想找到所有在我的股票表,該表必須的物品在隊列的前面 - 即。具有1的StatusCode其中那些項目沒有SKU具有1
例如一個的StatusCode我有一個在股票表格各種ProductCodes幾個項目,但可以有1S和2S的StatusCodes - 其中1表示在隊列中的第一個項目,2表示具有相同產品代碼項目的其餘部分。

我怎樣寫我的查詢來設置所有那些需要爲1的StatusCode項目,其中與給定的產品代碼沒有任何爲1的狀態代碼什麼?
我想設置爲1的狀態代碼列爲我必須將它們全部重置2作爲maintainence過程的一部分,需要還原「前的隊列」項目最近添加的股票項目。

最近添加:ListDate
的StatusCode:1(隊列的前部),2(庫存其他物品相同產品代碼)


下面是一些示例數據

庫存表

SKU ProductCode StatusCode 
1  111111   1 
2  111111   2 
3  222222   1 
4  222222   2 
5  333333   2 
6  333333   2 

上市表

ListID SKU ListDate 
01  1  01/01/2009 
02  2  02/01/2009 
03  3  03/01/2009 
04  4  04/01/2009 
05  5  05/01/2009 
06  6  06/01/2009 

在庫存表中SKU 6的ProductCode 333333具有兩個具有相同StatusCode的項目,我想將列表表格 中的最新ListDate設置爲StatusCode 1.這適用於所有其他情況這是我最需要的地方 最近添加的項目有這個StatusCode

+0

可否請你發佈一些樣品數據和你想得到什麼? – Quassnoi 2009-07-10 14:01:14

回答

0
UPDATE S1 
SET S1.StatusCode = 1 
FROM Stock S1 
LEFT JOIN Stock S2 
    ON (S1.ProductCode = S2.ProductCode 
     AND S2.StatusCode = 1) 
JOIN Listed L1 
    ON (S1.SKU = L1.SKU) 
WHERE S2.StatusCode IS NULL 
AND L1.ListDate = 
(SELECT MIN(L2.ListDate) 
    FROM Listed L2 
    WHERE L1.SKU = L2.SKU) 

有時候,你說你想「找」等項目(即我猜會是一個SELECT),有時你說你想「設置」他們的狀態碼 - 我採取了後者的操作,因爲它似乎更適合你描述的問題,因此更新。

此外,當多個其他滿意的項目具有相同的日期並且因此不可能唯一地定義最新的項目時,您不知道要執行什麼操作;也許你的情況下的其他consraints使這不可能?在這裏,我設置了所有狀態代碼,當然也可以設置它們中的任何一個或者任意選擇一個(通過按照其他標準排序?)。

0

這是pick-a-winner的變化...它是pick-all-losers

這裏的要點。有幾個記錄具有共同的價值,但是一個記錄是特殊的 - 它是勝利者。剩下的具有共同價值的記錄是輸家。

例如,此查詢通過使用最低ID從客戶中選出一個贏家(每名)。它通過定義子查詢中的贏家來做到這一點。

SELECT * 
FROM Customers c1 
WHERE 
(
SELECT Min(CustomerID) 
FROM Customers c2 
WHERE c2.Name = c1.Name 
GROUP BY c2.Name 
) = c1.CustomerID 

然後挑選輸家是一個簡單的變化:

SELECT * 
FROM Customers c1 
WHERE 
(
SELECT Min(CustomerID) 
FROM Customers c2 
WHERE c2.Name = c1.Name 
GROUP BY c2.Name 
) != c1.CustomerID 
0

這是一個共同主題的變體。這種類型的查詢類似的應用程序用於處理重複的行。在這個senario中,你可能想要刪除一個集合的所有行但除了一行外。

此查詢解決你的問題:

DECLARE @Stock如表(SKU BIGINT,產品代碼爲bigint,的StatusCode BIGINT)

INSERT INTO @Stock VALUES(1,111111,1) INSERT INTO @Stock VALUE(2,111111,2) INSERT INTO @Stock VALUES(3,222222,1) INSERT INTO @Stock VALUES(4,222222,2) INSERT INTO @Stock VALUES(5,333333,2) INSERT INTO @Stock VALUES(6,333333,2)

DECLARE @List編輯AS TABLE(ListID Bigint,SKU Bigint,ListDate DateTime)

INSERT INTO @Listed VALUES(1,1,'01/01/2009') INSERT INTO @Listed VALUES(2,2,'02/01/2009') INSERT INTO @Listed VALUES(3,3,'03/01/2009') INSERT INTO @Listed VALUES(4,4,'04/01/2009') INSERT INTO @Listed VALUES(5, ,如圖5所示,'05/01/2009 ') INSERT INTO @Listed VALUES(6,6,'06/01/2009')

UPDATE @Stock SET的StatusCode = 1 FROM @Stock AS T1 INNER JOIN @Listed AS T2 ON T1.SKU = T2.SKU WHERE T1.SKU IN

(SELECT TOP 1 T3.SKU FROM @Stock AS T3 INNER JOIN @Listed AS T4 ON T3.SKU = T4.SKU AND T3.ProductCode = T1.ProductCode ORDER BY ListDate)

和產品代碼IN (SELECT DISTINCT的ProductCode FROM @Stock AS S1 WHERE 1 NOT IN(SELECT DISTINCT的StatusCode FROM @Stock AS S2 WHERE S2.ProductCode = S1.ProductCode))