2017-02-15 2 views
-1

10 개의 행이 10 개의 행이 현재 행과 동일한 범주에 있음을 확인한 후 백분율 변경을 계산하도록 테이블을 업데이트하는 쿼리를 실행하려고합니다. 이것은 내가 사용하고있는 코드입니다.UPDATE가 SELECT와 다른 결과를 내고 있습니다.

update xstocks, 
(select date,symbol,o10,open,(open-o10)/o10 percentchange10 from (
select date,@s10 s10,@o10 o10,@s10:=s9 s9,@o10:=o9 o9,@s9:=s8 s8,@o9:=o8 o8,@s8:=s7 s7,@o8:=o7 o7,@s7:=s6 s6,@o7:=o6 o6,@s6:=s5 s5,@o6:=o5 o5,@s5:=s4 s4,@o5:=o4 o4,@s4:=s3 s3,@o4:=o3 o3,@s3:=s2 s2,@o3:=o2 o2,@s2:=s1 s1,@o2:=o1 o1,symbol, open from(
select date,@s9 s9,@o9 o9,@s9:=s8 s8,@o9:=o8 o8,@s8:=s7 s7,@o8:=o7 o7,@s7:=s6 s6,@o7:=o6 o6,@s6:=s5 s5,@o6:=o5 o5,@s5:=s4 s4,@o5:=o4 o4,@s4:=s3 s3,@o4:=o3 o3,@s3:=s2 s2,@o3:=o2 o2,@s2:=s1 s1,@o2:=o1 o1,symbol, open from(
select date,@s8 s8,@o8 o8,@s8:=s7 s7,@o8:=o7 o7,@s7:=s6 s6,@o7:=o6 o6,@s6:=s5 s5,@o6:=o5 o5,@s5:=s4 s4,@o5:=o4 o4,@s4:=s3 s3,@o4:=o3 o3,@s3:=s2 s2,@o3:=o2 o2,@s2:=s1 s1,@o2:=o1 o1,symbol, open from(
select date,@s7 s7,@o7 o7,@s7:=s6 s6,@o7:=o6 o6,@s6:=s5 s5,@o6:=o5 o5,@s5:=s4 s4,@o5:=o4 o4,@s4:=s3 s3,@o4:=o3 o3,@s3:=s2 s2,@o3:=o2 o2,@s2:=s1 s1,@o2:=o1 o1,symbol, open from(
select date,@s6 s6,@o6 o6,@s6:=s5 s5,@o6:=o5 o5,@s5:=s4 s4,@o5:=o4 o4,@s4:=s3 s3,@o4:=o3 o3,@s3:=s2 s2,@o3:=o2 o2,@s2:=s1 s1,@o2:=o1 o1,symbol, open from(
select date,@s5 s5,@o5 o5,@s5:=s4 s4,@o5:=o4 o4,@s4:=s3 s3,@o4:=o3 o3,@s3:=s2 s2,@o3:=o2 o2,@s2:=s1 s1,@o2:=o1 o1,symbol, open from(
select date,@s4 s4,@o4 o4,@s4:=s3 s3,@o4:=o3 o3,@s3:=s2 s2,@o3:=o2 o2,@s2:=s1 s1,@o2:=o1 o1,symbol, open from(
select date,@s3 s3,@o3 o3,@s3:=s2 s2,@o3:=o2 o2,@s2:=s1 s1,@o2:=o1 o1,symbol, open from(
select date,@s2 s2,@o2 o2,@s2:=s1 s1,@o2:=o1 o1,symbol, open from(
select date,@s1 s1,@o1 o1,@s1:=symbol symbol, @o1:=open open 
from xstocks order by symbol,date 
) sub1 
) sub2 
) sub3 
) sub4 
) sub5 
) sub6 
) sub7 
) sub8 
) sub9 
) sub10 
where s10 = symbol) src 
set xstocks.percentchange10 = src.percentchange10; 

오류없이 실행되지만 업데이트 된 값은 모두 동일합니다 (제 경우는 0.2625). SELECT 대신 UPDATE (다른 것을 변경하지 않고)를 사용하여 쿼리를 실행하면 원하는 출력이 표시됩니다. 이 첫 번째 결과로 각 행을 업데이트하는 것이 아니라, 각 행과 일치하는 것으로 보인다 있도록

select * from 
(select date,symbol,o10,open,(open-o10)/o10 percentchange10 from (
select date,@s10 s10,@o10 o10,@s10:=s9 s9,@o10:=o9 o9,@s9:=s8 s8,@o9:=o8 o8,@s8:=s7 s7,@o8:=o7 o7,@s7:=s6 s6,@o7:=o6 o6,@s6:=s5 s5,@o6:=o5 o5,@s5:=s4 s4,@o5:=o4 o4,@s4:=s3 s3,@o4:=o3 o3,@s3:=s2 s2,@o3:=o2 o2,@s2:=s1 s1,@o2:=o1 o1,symbol, open from(
select date,@s9 s9,@o9 o9,@s9:=s8 s8,@o9:=o8 o8,@s8:=s7 s7,@o8:=o7 o7,@s7:=s6 s6,@o7:=o6 o6,@s6:=s5 s5,@o6:=o5 o5,@s5:=s4 s4,@o5:=o4 o4,@s4:=s3 s3,@o4:=o3 o3,@s3:=s2 s2,@o3:=o2 o2,@s2:=s1 s1,@o2:=o1 o1,symbol, open from(
select date,@s8 s8,@o8 o8,@s8:=s7 s7,@o8:=o7 o7,@s7:=s6 s6,@o7:=o6 o6,@s6:=s5 s5,@o6:=o5 o5,@s5:=s4 s4,@o5:=o4 o4,@s4:=s3 s3,@o4:=o3 o3,@s3:=s2 s2,@o3:=o2 o2,@s2:=s1 s1,@o2:=o1 o1,symbol, open from(
select date,@s7 s7,@o7 o7,@s7:=s6 s6,@o7:=o6 o6,@s6:=s5 s5,@o6:=o5 o5,@s5:=s4 s4,@o5:=o4 o4,@s4:=s3 s3,@o4:=o3 o3,@s3:=s2 s2,@o3:=o2 o2,@s2:=s1 s1,@o2:=o1 o1,symbol, open from(
select date,@s6 s6,@o6 o6,@s6:=s5 s5,@o6:=o5 o5,@s5:=s4 s4,@o5:=o4 o4,@s4:=s3 s3,@o4:=o3 o3,@s3:=s2 s2,@o3:=o2 o2,@s2:=s1 s1,@o2:=o1 o1,symbol, open from(
select date,@s5 s5,@o5 o5,@s5:=s4 s4,@o5:=o4 o4,@s4:=s3 s3,@o4:=o3 o3,@s3:=s2 s2,@o3:=o2 o2,@s2:=s1 s1,@o2:=o1 o1,symbol, open from(
select date,@s4 s4,@o4 o4,@s4:=s3 s3,@o4:=o3 o3,@s3:=s2 s2,@o3:=o2 o2,@s2:=s1 s1,@o2:=o1 o1,symbol, open from(
select date,@s3 s3,@o3 o3,@s3:=s2 s2,@o3:=o2 o2,@s2:=s1 s1,@o2:=o1 o1,symbol, open from(
select date,@s2 s2,@o2 o2,@s2:=s1 s1,@o2:=o1 o1,symbol, open from(
select date,@s1 s1,@o1 o1,@s1:=symbol symbol, @o1:=open open 
from xstocks order by symbol,date 
) sub1 
) sub2 
) sub3 
) sub4 
) sub5 
) sub6 
) sub7 
) sub8 
) sub9 
) sub10 
where s10 = symbol) src; 

선택 (SELECT)를 사용 percentchange10 열에있는 첫 번째 값은 0.2625이다. 원하는 결과는 xstocks의 각 행을 SELECT 쿼리의 결과에서 해당 행으로 업데이트하는 것입니다.

+0

제쳐두고 (질문에 엄격하게 관련되지 않음) SQL에 대한 공식 교육이 없으므로 (아직) UPDATE 쿼리의 순서를 완전히 이해하지 못했습니다. 나는 이것이이 문제와 관련이 있다고 생각하지만, 그것에 관한 나의 지식 부족 이외에 이것을 의심 할 구체적인 이유가 없다. –

+0

이 고유 한 쿼리를 작성해야하는 경우 스키마에 구조적으로 잘못된 점이 있습니다. [0, 1 또는 무한대 규칙] (http://en.wikipedia.org/wiki/Zero_one_infinity_rule)의 [데이터베이스 정규화] (http://en.wikipedia.org/wiki/Database_normalization)을 위반 한 적이 있습니까? – tadman

+0

중복 데이터를 생성한다고 (데이터를 필요할 때마다 항상 다시 계산할 수 있기 때문에) 말할 수 있다고 가정 할 수 있습니다.하지만 그 데이터를 위반하지 않은 데이터는 아닙니다. 모든 변수를 사용하는 이유는 지연 함수를 시뮬레이션하여 테이블의 1,000,000 개가 넘는 행 모두에서 조인을 수행하지 않아도되기 때문입니다. –

답변

0

WHERE xstocks.id = src.id과 함께 추가하면 원하는 결과를 얻을 수 있습니다 (길다란 쿼리를 테스트하는 데 사용되는 작은 70,000 행 테이블 이상).

관련 문제