create table comp_ (Comcode varchar(10)null
,gubun varchar(1)null
,BrenchSusu decimal(5,2) null
,CardSusu decimal(5,2) null
,CashSusu decimal(5,2) null
)
create table parts_ (barcode varchar(10)null
,Comcode varchar(5)null
,item varchar(20) null
,BrenchSusu decimal(5,2) null
)
create table outd_ (junno varchar(10) null
,barcode varchar(10)null
,comcode varchar(5) null
,money1 decimal(15,2) null
,BrSusuMoney1 decimal(15,2) null
,CardMoney1 decimal(15,2) null
,CashMoney1 decimal(15,2) null
)
insert into comp_ values ('10001', '', 10, 0, 0), ('10002', 'S', 1, 2, 3), ('10003', '', 10, 20, 30), ('10004', '', null, null, null)
insert into parts_ values ('11111', '10001', '', 0), ('22222', '10001', '', 10), ('33333', '10001','', 20)
, ('44444', '10002', '', 0), ('55555', '10002', '', null)
, ('66666', '10003', '', 0), ('77777', '10003', '', 10)
, ('88888', '10004','', 20), ('99999', '10004','', 0)
insert into outd_ values ('00000', '11111', '10001', 1000, 0, 0, 0), ('00000', '22222', '10001', 2000, 0, 0, 0)
, ('00000', '33333', '10001', 3000, 0, 0, 0), ('00000', '55555', '10002', 2000, null, null, null)
, ('00001', '88888', '10004', 1000, 0, 0, 0), ('00001', '99999', '10004', 2000, 0, 0, 0)
, ('00001', '11111', '10001', 3000, 0, 0, 0), ('00001', '22222', '10001', null, null, null, null)
, ('00001', '55555', '10002', 2000, 0, 0, 0)
--쿼리 1안
update d set d.BrSusuMoney1 = ISNULL(d.money1, 0.00) * (p.BrenchSusu / 100)
, d.CardMoney1 = ISNULL(d.money1,0.00) * (p.CardSusu / 100)
, d.CashMoney1 = ISNULL(d.money1,0.000) * (p.CashSusu / 100)
from outd_ as d
Join (select p.barcode, ISNULL(p.BrenchSusu,0.00) as BrenchSusu, ISNULL(c.CardSusu,0.00) as CardSusu, ISNULL(c.CashSusu,0.00) as CashSusu
from parts_ p
join
(select comcode, CardSusu, CashSusu from comp_ where gubun = 'S') c
on p.Comcode = c.Comcode
where p.Comcode = c.Comcode) P
on d.barcode = p.barcode
where d.junno='00000'
--쿼리 2안
update d set d.BrSusuMoney1 = ISNULL(d.money1, 0.00) * (p.BrenchSusu / 100)
, d.CardMoney1 = ISNULL(d.money1,0.00) * (p.CardSusu / 100)
, d.CashMoney1 = ISNULL(d.money1,0.000) * (p.CashSusu / 100)
from outd_ as d
Join (select p.barcode, ISNULL(p.BrenchSusu,0.00) as BrenchSusu, ISNULL(c.CardSusu,0.00) as CardSusu, ISNULL(c.CashSusu,0.00) as CashSusu
from (select barcode, comcode, BrenchSusu from parts_ where barcode in (select barcode from outd_ where junno='00000')) p
join
(select comcode, CardSusu, CashSusu from comp_ where gubun = 'S') c
on p.Comcode = c.Comcode
where p.Comcode = c.Comcode) P .
on d.barcode = p.barcode
where d.junno='00000'
outd_ 의 BrSusuMoney1 은 parts_ 의 BrenchSusu 로 계산하고 CardMoney1 와 CashMoney1 은 comp_ 의 cardsusu, cashsusu로 게산하는
쿼리입니다.
쿼리1안과 쿼리 2안의 차이점은 join 절의 인라인뷰에서 parts_ 의 바코드을 가지고 올때 outd_의 junno을
참조하느냐, 안하느냐 차이입니다.
저는 2안이 좀더 직관적이라 더 좋은것 같습니다.
질문은 join 절의 쿼리결과 값이 아무것도 없다면 update 문장이 실행되는지 안되는지 궁금합니다.
실행은 되는데 update 할것이 없으므로 update 가 안되는것인지 아니면 실행자체가 안되는 것인지.?
항상 물음표에 길잡이가 되어주는 커뮤니티에 감사드립니다.
Comment 6
-
Terry
2016.04.22 17:11
-
항해자™
2016.04.22 17:11
쿼리는 실행 하였으나, 적용 될 데이터가 없는 것 입니다,,
추가로, 위의 쿼리에서 서브쿼리 형태는 굳지 필요 없어 보입니다,,,
-
항해자™
2016.04.22 17:31
서브 쿼리를 제거해 보았습니다,,
update a set a.BrSusuMoney1 = isnull(a.money1,0.00) * (isnull(b.BrenchSusu,0.00) / 100) , a.CardMoney1 = isnull(a.money1,0.00) * (isnull(c.CardSusu,0.00) / 100) , a.CashMoney1 = isnull(a.money1,0.000) * (isnull(c.CashSusu,0.00) / 100) from outd_ as a inner join parts_ as b on b.barcode = a.barcode inner join comp_ as c on c.Comcode = b.Comcode where a.junno = '00000' and c.gubun = 'S' option(force order);
-
ilovejsp
2016.04.22 17:26
제가 테스트해보니깐 update실행유무는 조인문장과 관련이 없는것 같습니다. 중요한것은 select,join문이든 해당 결과값이 있느냐가 중요한것같습니다.,
근데 두번째 쿼리결과에서는 실행할때마다 1개 행이 영향을 받는다고 나오는데요
update d set d.BrSusuMoney1 = ISNULL(d.money1, 0.00) * (p.BrenchSusu / 100)
, d.CardMoney1 = ISNULL(d.money1,0.00) * (p.CardSusu / 100)
, d.CashMoney1 = ISNULL(d.money1,0.000) * (p.CashSusu / 100)
from outd_ as d
Join (select p.barcode, ISNULL(p.BrenchSusu,0.00) as BrenchSusu, ISNULL(c.CardSusu,0.00) as CardSusu, ISNULL(c.CashSusu,0.00) as CashSusu
from (select barcode, comcode, BrenchSusu from parts_ where barcode in (select barcode from outd_ where junno='00000')) p
join
(select comcode, CardSusu, CashSusu from comp_ where gubun = 'S') c
on p.Comcode = c.Comcode
where p.Comcode = c.Comcode) P on d.barcode = p.barcode
where d.junno='00000'이유는 같은 값에 대해서 같은값으로 update를 하기 때문입니다.
조인문과는 관련없습니다.
-
희망나라
2016.04.22 19:10
답변 감사드립니다.
option
(
force
order
); 는 뭘의미하는 건가요.?
첨보는 옵션입니다.
-
이리
2016.04.22 19:55
https://msdn.microsoft.com/ko-kr/library/ms181714(v=sql.120).aspx
- FORCE ORDER
쿼리 구문에 지정된 조인 순서가 쿼리 최적화 시 유지되도록 지정합니다. FORCE ORDER를 사용해도 쿼리 최적화 프로그램이 취할 수 있는 역할 반전 동작에는 영향을 미치지 않습니다.참고 MERGE 문에서 WHEN SOURCE NOT MATCHED 절이 지정되어 있지 않으면 원본 테이블은 기본 조인 순서에 따라 대상 테이블보다 먼저 액세스됩니다. FORCE ORDER를 지정하면 이러한 기본 동작이 유지됩니다.
Join 이라고만 쓰면..Inner Join 이 맞죠? ^^;
Inner , Left , Right, Full Outer ..각각의 종류를 다 기술해서 쓰다보니..
Inner Join 이 맞다는 전제하에 Join 되는 테이블의 결과값이 0행이면..
실행이 안되죠..아니 엄밀히 말하면 0행이 수행된다고 해야되려나요?
SQL 내부 처리 로직은 모르겠지만요..-,-;;;