DB/MSSQL 3

[MSSQL] Function-Based Index

MSSQL에서는 Function-Based Index라는 개념이 없다고 함. 그러나, 계산된 열(Computed Column)을 사용하여 비슷한 기능을 구현할 수 있다고 함.(Oracle의 virtual 컬럼과 동일한 기능인 듯 싶음) 1. 테이블 생성CREATE TABLE MY_TABLE ( ID INT, FIRST_NAME VARCHAR(20), LAST_NAME VARCHAR(20)); 2. Computed Column 추가 ALTER TABLE [MY_TABLE] ADD FULL_NAME AS CONVERT(NVARCHAR(100), TRIM(FIRST_NAME + ' ' + LAST_NAME)); 3. 인덱스 추가CREATE INDEX FULL_NAME_IDX ON MY_TABL..

DB/MSSQL 2023.07.04

[MSSQL] MAX KEEP

아래와 같은 데이터가 있을 때, 각 JOB별로 가장 많은 SALARY의 NAME을 알고 싶다면 설계자 ☞ 송차장 750 개발자 ☞ 정사원 160 ORACLE은 아래와 같이.. WITH EMP AS ( SELECT '남이사' AS NAME , '설계자' AS JOB , 700 AS SALARY FROM DUAL UNION ALL SELECT '이부장' AS NAME , '설계자' AS JOB , 680 AS SALARY FROM DUAL UNION ALL SELECT '송차장' AS NAME , '설계자' AS JOB , 750 AS SALARY FROM DUAL UNION ALL SELECT '강대리' AS NAME , '개발자' AS JOB , 80 AS SALARY FROM DUAL UNION ALL..

DB/MSSQL 2022.06.30

[MSSQL] EXISTS 주의사항

아래와 같은 SQL 이 있었다. DELETE FROM TB_D WHERE EXISTS ( SELECT 1 FROM TB_M B WHERE B.NO = @NO AND B.PK = PK ) 의도 자체는 TB_M을 이용하여 TB_D의 특정 데이터만 삭제하길 원했던 것으로 보인다. 그러나 실제론 운영서버 TB_D 테이블의 모든 데이터가 삭제 되고 있었다 ㅜ_ㅜ 확인하여 보니 아래 부분이 문제가 되고 있었다. TB_D와 TB_M간의 PK 컬럼을 비교하는 것이 아닌, TB_M과 TB_M간의 PK 컬럼을 비교하고 있었다. DELETE FROM TB_D WHERE EXISTS ( SELECT 1 FROM TB_M B WHERE B.NO = @NO AND B.PK = PK -- 비교 구문이 무조건 TRUE. ) 오라클이..

DB/MSSQL 2022.06.21