MSSQL DEFAULT값 넣기 ..MSSQL 디폴트값 집어 넣기 ..

 

ALTER TABLE [TABLE_NAME] ADD CONSTRAINT [CONSTRAINT_NAME] default 0 for COLUMN_NAME

 

다중 디폴트값 넣기 가능 .

ALTER TABLE [TABLE_NAME] ADD CONSTRAINT [CONSTRAINT_NAME]  DEFAULT 0   FOR     COLUMN_NAME

                                                    ,CONSTRAINT [CONSTRAINT_NAME] DEFAULT 0    FOR COLUMN_NAME

아시는 분도 많이 있을테지만

 

MSSQL의

left outer join과 *= 는 같은 표현이 아닙니다.

 

left outer join과 *=는 전혀 다른 쿼리 입니다.

 

 

 

예를 들어 다음과 같은 테이블이 있습니다.

 

 

select * from A;

YM         EMP       DEPT

200212  1   40

200212  2   40

200212  3   40

200212  4   40

200212  5   40

200212  6   40

200212  7   40

200212  8   40

 

select * from B;

YM         EMP       DEPT

200212  1   40

200212  2   40

200212  3   40

200212  4   40

 

 

 

(1)

select count(*)

from A left outer join  B

on  A.emp = B.emp

where A.ym = '200212'

and B.ym='200212'

and A.dept='40';

 

result : 4

 

(2) select  count(*)

from A , B

where A.emp *= B.emp

and A.ym = '200212'

and B.ym='200212'

and A.dept='40';

 

result : 8

 

 

직접 돌려보시면 확인 가능하듯이

위의 적은 바와 같이 결과가 다르게 나옵니다.

 

 

많은 사람들이

MSSQL에서

LEFT Outer Join 과 *=는 동의어라고 생각하지만 사실은 그렇지 않습니다.

LEFT Outer Join과 *= 는 의미적으로 다른 사용입니다.

 

MSSQL의 *= 을 사용하지 말라는 권고사항을

단지 과거의 사용형식이기 때문이라고 생각하기 때문에 흘려듣는데..(일부 책에도 그렇게 소개되

기도 했지만..)

 

*=이 소개되었을때 ANSI에서는 Outer 조인에 대하여 어떠한 표준이나 사양이 존재하지 않았습니

다. 이런 문제로 ANSI위원회에서는 Outer 조인의 올바른 의미와 구현원칙을 제정하였고 이후

MSSQL 6.5에서 ANSI OUTER JOIN이 체택되었습니다.

 

즉 *= 는 이전의 MSSQL의 하위버전을 위해 지원하는 이전의 'MSSQL식'의 Outer JOIN 형식입니다.

 

둘의 근본적인 차이는 이렇습니다.

 

1구문의

and B.ym='200212'

는 아웃터 조인이 일어난후에 조건 체크가 되고

 

2구문의

and B.ym='200212'

는 아웃터 조인이 일어나기전에 조건 체크가 됩니다.

 

즉 1구문에서 4개의 행밖에 나오지 않은것은

OUTER JOIN을 한 후에  B.ym='200212' 조건에 의해

B.ym이 Null 인것을 제외하였기 때문입니다.

 

반면에 2구문에서 8개의 행이 나온것은

조인이 일어나기 전에 B테이블의 4건을 선택하는 조건으로

and B.ym='200212'이 이용되고

그 이후에 Outer Join이 실행되었습니다.

 

상황에 따라 다른 조건을 추가로 기입해서 같은 결과가 나오도록 할수 있으나

이를테면

1의 구문을

and (BB.ym = '200212' or BB.ym is null ) 식으로 수정하여야 합니다.

(그러나 이것도 B의 ym 컬럼이 Not Null이 아니라면 같은 결과를 보장할수 없습니다.. )

 

이런 미묘한 차이는 찾기 어려운 버그를 양산시키므로

말 그대로 *= 식의 사용법은 "권장하지 않습니다."

 

--차집합(A-B) (Outer Join 으로도 가능)

SELECT  *

FROM    테이블A A

WHERE   NOT EXISTS  (   

                        SELECT  1

                        FROM    테이블B B

                        WHERE   B.필드A = A.필드A

                        AND     B.필드B = A.필드B

                        AND     B.필드C = A.필드C

                    )

 

--교집합(A∩B) (Inner Join 으로도 가능)

SELECT  *

FROM    테이블A A

WHERE   EXISTS  (   

                    SELECT  1

                    FROM    테이블B B

                    WHERE   B.필드A = A.필드A

                    AND     B.필드B = A.필드B

                    AND     B.필드C = A.필드C

                )

 

 

--합집합(A∪B) ( Union all 대신 Union을 사용하면 중복행을 한행으로 출력 )

SELECT  *

FROM    테이블A A

UNION ALL

SELECT  *

FROM    테이블B B

 

------------------------------------------------------------------------------------------

< 출처 : http://www.devpia.com/forum/BoardView.aspx?no=525&forumname=sql_lec >

 

sql function 사용방법

 

CREATE OR REPLACE FUNCTION HONDA.getteset(
vlclass in varchar2, // 파라미터값,
vmclass in varchar2, 
vidx in varchar2
)
RETURN varchar2 IS // 리턴형을 지정.
tmpVar varchar2(4000);  // 리턴값을 셋팅
BEGIN
   select value into tmpVar from t_chartdata where lclass = vlclass  and mclass = vmclass  and idx = vidx; // 값을 구하기 위한 쿼리
   RETURN tmpVar;
   EXCEPTION
     WHEN NO_DATA_FOUND THEN
       NULL;
     WHEN OTHERS THEN
       -- Consider logging the error and then re-raise
       RAISE;
END getteset;
/
사용법
select  getteset(aa.lclass,aa.mclass,aa.idx) from table_nm aa

Create Function getUser_nm (
 @puser_id  varchar(30)
)

Returns varchar(30)    
As
Begin
DECLARE @return_value varchar(10)    
 select @return_value=user_nm  from tbs_user_info where user_id = @puser_id
if(@return_value!='')
 RETURN @return_value
else
 select @return_value=biz_nm  from tbs_biz_info where biz_id = @puser_id
RETURN @return_value 

End

12345

+ Recent posts