2014-11-04 3 views
0

Это простой запрос с использованием CTE, но он не ведет себя так, как я хочу.CTE с обновлением

Идея состоит в том, чтобы отфильтровать эти записи wit 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 в обновлении вместо таблицы. –

+1

http://sqlfiddle.com/#!6/d41d8/22705 –

ответ

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 INSERTS все записи вставленные с Codigo = 'stock1'. Поэтому в операторе UPDATE вы обновляете все записи с @ mytable1 до уровня уровня1 с @ mytable2.

Например, если ваш пример таблицы 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) 

Тогда ваш CTE обновляет stock2 записи, как указано от 7/10/2014 записей:

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 
Смежные вопросы