2009-07-10 71 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))