2014-11-04 75 views
0

這是一個簡單的查詢,與CTE一起使用,但不像我想要的那樣工作。CTE更新

這個想法是過濾這些記錄precio_90 = null,然後更新字段precio_90與mytable2的價格,其中codigo = codigo在特定日期。 目前我得到的所有記錄沒有實際的過濾器更新。

DECLARE @mytable1 TABLE 
(
codigo VARCHAR(10) NOT NULL, 
precio_90 NUMERIC(10, 4) 
); 

DECLARE @mytable2 TABLE 
(codigo VARCHAR(10) NOT NULL, 
fecha date NOT NULL, 
precio NUMERIC(10, 4) NOT NULL 
); 

INSERT INTO @mytable1(codigo, precio_90) 
VALUES ('stock1', 51), 
('stock1', 3), 
('stock1',5), 
('stock1',6), 
('stock1',2), 
('stock1',7), 
('stock1',null) 

INSERT INTO @mytable2(codigo, fecha, precio) 
VALUES ('stock1', '20140710', 26), 
('stock2', '20140711', 66), 
('stock1', '20140712', 23), 
('stock2', '20140710', 35); 

;WITH CTE_1 
as 
(SELECT codigo, precio_90   
    FROM @mytable1 
    where precio_90 is null) 

UPDATE t1 
SET t1.precio_90= t2.[precio] 
from @mytable1 as t1 
INNER JOIN @mytable2 as t2 
ON t1.codigo = t2.[codigo] and '2014-07-10'=t2.fecha 
+0

嘗試在更新中使用CTE而不是表格。 – 2014-11-04 18:07:32

+1

http://sqlfiddle.com/#!6/d41d8/22705 – 2014-11-04 18:15:22

回答

1

嗯,首先,你不要在更新的任何地方使用CTE,這就是爲什麼你的結果沒有被正確過濾的原因。其次,你不需要CTE ...你可以在更新中過濾precio_90 is null

UPDATE t1 
SET t1.precio_90= t2.[precio] 
from @mytable1 as t1 
INNER JOIN @mytable2 as t2 ON t1.codigo = t2.codigo 
where t1.precio_90 is null 
    and '2014-07-10'=t2.fecha 
1

從您的樣本@mytable1插入,所有插入codigo ='stock1'的記錄。因此,在您的UPDATE聲明中,您將@ mytable1中的所有記錄從@ mytable2更新爲stock1級別。

例如,如果你的樣表1有過這樣與stock2記錄:

INSERT INTO @mytable1(codigo, precio_90) 
VALUES ('stock1', 51), 
('stock1', 3), 
('stock1',5), 
('stock1',6), 
('stock2',2), -- Set to stock2 
('stock2',7), -- Set to stock2 
('stock1',null) 

然後從2014年7月10日的記錄中指定的CTE正在更新stock2記錄:

codigo  precio_90 
---------- --------------------------------------- 
stock1  26.0000 
stock1  26.0000 
stock1  26.0000 
stock1  26.0000 
stock2  35.0000 
stock2  35.0000 
stock1  26.0000 
1
UPDATE t1 
      SET t1.precio_90 = t2.[precio] 
    from @mytable1 as t1 
    JOIN @mytable2 as t2 
     ON t1.[codigo] = t2.[codigo] 
     and t2.fecha = '2014-07-10' 
     and t1.precio_90 is null 
     and t2.precio_90 is null