[MSSQL] 로우 합치기 STUFF, FOR XML PATH, mysql group_concat 기능


개발을 하다보면 가끔씩 필요한 기능이다.


중복되는 로우가 있는데 조인하면 다른 데이터들도 같이 나올때


중복되는거 합치고 여러로우로 된 데이터들만 한 컬럼에 한줄로 표현하고 싶을때가 있다.



ID 

data 

 사과

배 

 2

망고 

사과 

배 


이런 경우


ID 

data 

사과,배 

 2

망고,사과,배 


이렇게 뽑아내고 싶을때 사용하는 방법이다.



여기서 사용할건 STUFF와 FOR XML PATH다


간단하게 그냥 예제를 보도록 하자


1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT 
    DISTINCT ID, -- id 중복 제거
    STUFF(( 
        SELECT 
            ',' + DATA
        FROM 
            dataTbl b 
        WHERE 
            b.ID = a.ID 
            FOR XML PATH('') ),1,1,'') AS NAME 
FROM 
    dataTbl a
 
cs


이런식으로 사용하면 된다.


dataTbl이 단일 테이블이 아니라 그냥 괄호로 묶어서 조인해놓은 서브쿼리를 사용해도 무방하다.



[MSSQL] 날짜,시간 데이터 생성하기



날짜나 시간단위의 데이터가 로우로 들어 오는 경우


간혹 데이터 자체가 누락 되는 경우가 있다


시간 순서대로 보여줘야 하는데 데이터 누락으로 로우가 없어 데이터가 땡겨져버리는 경우가 있기 때문에


그런종류의 데이터는 별도로 시간이나 날짜 로우를 만들어 낸 후 거기에 끼워 맞추는 식으로 가져 온다.



oracle을 사용할때는 별 문제 없이 만들었는데


mssql에서는 날짜나 시간을 만들어 내는 쿼리를 몰라 한참을 해매다 알아낸 방법이다


1. 날짜+시간 단위 생성 방법


1
2
3
4
5
6
7
8
9
10
11
12
13
DECLARE @start_date DATETIME = '2018-07-12 00:00:00.000'-- 시작시간
DECLARE @end_date DATETIME = '2018-07-13 00:00:00.000'-- 
 
WITH    AllDays
          AS ( SELECT   @start_date AS [Date], 1 AS [level]
               UNION ALL
               SELECT   DATEADD(hour, 1, [Date]), [level] + 1
               FROM     AllDays
               WHERE    [Date] < @end_date )
 
 
     SELECT [Date], [level]
     FROM   AllDays OPTION (MAXRECURSION 0)
cs



1-1 결과값






위와 같이 쿼리를 짜주게 되면 해당 범위만큼의 날짜,시간을 생성해 준다



2. 날짜단위 생성방법


1
2
3
4
5
6
7
8
DECLARE @Date1 DATE, @Date2 DATE
SET @Date1 = '20150430'
SET @Date2 = '20150601'
 
SELECT DATEADD(DAY,number+1,@Date1) [Date]
FROM master..spt_values
WHERE type = 'P'
AND DATEADD(DAY,number+1,@Date1) < @Date2
cs


2-1 결과값






이런 결과를 얻어낼 수 있다.



와...


그런데 이거 포스팅하다가 실제로 프로젝트에 써야 하는 쿼리 실수로 날려먹음...



다시 짜야 되는데 스트레스 엄청받는다.


[MSSQL] 프로시저 트리거 while 반복문, 변수값 컬럼명으로 사용하는 방법





1
2
3
4
5
6
7
8
9
10
11
12
declare @colCount int, @colNum int, @columnName CHAR(8) -- 변수 선언
set @colCount = 0
 
while @colCount < 24 -- 반복문 시작
    begin
        SET @columnName = 'T' -- 변수를 컬럼명으로 사용하기 위한 변수
        IF @colCount < 10 BEGIN
            SET @columnName = 'T0' -- 컬럼명이 T00 T01 T02 이런식일때 
        END
        exec ('select ' + @columnName + @colCount + 'into tValData from T_TABLE_NAME')
        set @colCount = @colCount +1 -- 
    end -- 반복문 끝
cs



테이블의 컬럼명이 T00 T01 이런식으로 될떄가 있다.


for문을 돌리고 싶다거나 변수값을 컬럼명으로 사용하고 싶을땐 위와 같이 사용 하면 된다.

[Spring] MyBatis Batch + Transaction 을 이용한 대용량 SQL작업


마을에서 오크잡는 퀘스트 하고 있는데 갑자기


중간보스를 잡아오라는 퀘스트가 떨어졌다...



일정시간마다 라즈베리파이에서 받아온 원시데이터를 재가공하여


DB에 insert 해주어야 하는 작업


로우수가 적다면 그냥 만들겠지만 대용량 작업일 경우 답이 안나온다.


약 1만건~10만건 정도의 데이터를 날려줘야 하는데 ㅂㄷㅂㄷㅂㄷ


그래서 찾아본 방법은 Batch와 Transaction 을 이용한 대용량 sql 작업



나도 정확히 내가 뭘 한건지도 모르고 그냥 스택오버 플로우, 오키, 전자정부 뒤적거리면서 이것 저것 다 때려 박느라

필요 없는 설정이 있을 수도 있으니 아는 사람은 댓글좀 달아주시길 바랍니다.



1.  XML 설정


1) mapper 설정

context-mapper.xml 파일이나 context-sqlMap.xml 파일에


마이바티스 연동을 위해 만들어놨던 설정을 아래와 같이 바꿔준다.


9번 라인의 batch설정으로 batch 사용이 가능 하도록 하는 듯 하다.


1
2
3
4
5
6
7
8
9
10
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation" value="classpath:/egovframework/sqlmap/example/sql-mapper-config.xml" />
        <property name="mapperLocations" value="classpath:/egovframework/sqlmap/example/mappers/mssql/*.xml" />
    </bean>
 
    <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache">
        <constructor-arg index="0" ref="sqlSession" />      
        <constructor-arg index="1" value="BATCH" />
    </bean>
cs



2) datasource 설정

DB접속 정보 작성하는 곳에 트렌젝션메니저 설정을 하는데 이걸 해야 하는 건진 잘 모르겠다.


1
2
3
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>
cs



3) dispatcher-servlet 설정


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:p="http://www.springframework.org/schema/p"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xmlns:task="http://www.springframework.org/schema/task" 
        xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
                   http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
                http://www.springframework.org/schema/context 
                http://www.springframework.org/schema/context/spring-context-4.0.xsd
                http://www.springframework.org/schema/task
                http://www.springframework.org/schema/task/spring-task.xsd
                http://www.springframework.org/schema/mvc 
                http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
                http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
 
 
<tx:annotation-driven proxy-target-class="true"/>
cs


7번 라인과 17번 라인을 추가해주고 20번라인의 내용을 넣어 주도록 한다.



4) pom.xml


1
2
3
4
5
6
7
8
<!-- 트랜젝션 처리를 위함 -->
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>2.2</version>
            <type>jar</type>
            <scope>compile</scope>
        </dependency>
cs



디펜던시에 추가를 해줘야 트랜젝션 처리가 가능한건진 모르겠음. 전자정부 자체에 관련된게 이미 추가 되어 있을 수도 있고

정확히 모르겠음 저건



2. DAO or impl 작성


나는 DAO를 사용하지 않고 공통DAO하나 만들어 놓고 impl에서 바로 쿼리를 날려주는 방식을

좋아 한다.


어차피 DAO에서 특별히 해줄것도 없고.. 해줘야 하는것이 있어도 impl에서 해주면 되니까



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Override
    public void updateSchedulerHistoryRow(List<MinHistoryVO> historyList) {
        // TODO Auto-generated method stub
        
       // 트렌젝션 시작
        SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
        long startTime = System.currentTimeMillis();
            try {
                
                for (MinHistoryVO list : historyList) {                     
                    sqlSession.update("scheduler.updateSchedulerHistoryRow", list);
                }
 
            } finally {
                sqlSession.flushStatements();
                sqlSession.close();
            }
 
        long endTime = System.currentTimeMillis();
        long resutTime = endTime - startTime;
        System.out.println("트랜젝션 배치" + " 소요시간  : " + resutTime/1000 + "(ms)");
    }
cs



난 이런식으로 작성 했다.


가끔 6번 라인에 ExecutorType.BATCH 이 매개변수를 안넣고 시작 할 수 있는데

그러면 트렌젝션 안돌고 커넥션 다 찍으면서 돌게 된다.


저렇게 해도 수만건이 돌게 되면 세션에저장될 데이터들이 넘쳐흘러서 그런지 버벅거릴때가 있는데


그럴땐 컨트롤러에서 조금씩 끊어서 날려 주도록 하자



3. controller


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
        //컨트롤러에서 일정 개수 단위로 끊어서 날려 준다.
        int insertCount = 0;
        List<MinHistoryVO> divHisList  = new ArrayList<MinHistoryVO>();
        for(int hisCount = 0, hisSize = historyList.size(); hisCount < hisSize; hisCount++){
            MinHistoryVO _tempData = new MinHistoryVO();
            _tempData = historyList.get(hisCount);
            divHisList.add(_tempData);
            if(insertCount == 1000 || hisSize-1 == hisCount){
                schedulerService.updateSchedulerHistoryRow(divHisList); // 트렌젝션
                divHisList =  new ArrayList<MinHistoryVO>();
                insertCount = 0;
            }
            else{                    
                insertCount++;
            }
        }
cs



while문 사용하는게 익숙하지 않아서 나는 for문을 주로 사용 한다.

리스트에 잔뜩 있는 데이터들을 새로운 작은 바구니에 담아서 끊어서 날려준다.








이렇게 하면 MsSql Server 2005버전 기준 1만건 insert하는데 5초정도 걸린다.


저기에  마이바티스 foreach까지 써서 벌크인서트 하면 시간은 더 단축 된다.


원시데이터를 쪼개서 60개컬럼에 따로 박아야 하기 때문에


넘겨주는 파라미터 개수 2100개 제한이 있어서 제대로 사용 못했는데


여러개로 쪼갠다음에  Mybatis foreach 돌려서 한번에 날려주면 시간은


훨씬 더더더더더 단축 된다.





[MSSQL]Insert실행시 자동증가되는 IDENTITY값 바로 가져오기



insert를 실행시키고 자동으로 증가 되도록 해놓은 PK값이 바로 필요한 경우가 있다.


A테이블에 값이 입력되면 그 값에 종속되는 B테이블의 값을 넣어야 하는데


PK를 알아오기 위해서 insert후 다시 select 하더라도 한 컨트롤러에서 해결하기란 힘들다.


게다가 해당 pk값을 모르기 때문에 다시 select 하는 것도 문제.


해결 방법


1
2
SELECT @@IDENTITY
 
cs

이걸 사용 하는 것 이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
 
INSERT INTO 
        T_AUTH
        (
         VAL1
        ,VAL2
        ,VAL3)
values(
        #{VAL1}
        ,#{VAL2}
        ,#{VAL3})
 
SELECT @@IDENTITY AS SEQ
cs



이런식으로 사용 하면


SEQ라는 컬럼에 자동증가된 값을 반환 한다


참고로 MYBAITIS에서는


INSERT가 아니라 SELECT로 감싸줘야 정상 작동 한다


예를 들어


1
2
3
4
5
6
7
8
9
10
11
12
13
14
<select id="insertAuth" parameterType="VO" resultType="VO">
    INSERT INTO 
        T_AUTH
        (
         VAL1
        ,VAL2
        ,VAL3)
    values(
        #{VAL1}
        ,#{VAL2}
        ,#{VAL3})
 
    SELECT @@IDENTITY AS SEQ
</select> 
cs



이런식으로 만들면 VO SEQ에 해당 값이 담겨서 리턴 된다.


 - 기준날짜

 

​   2000년 01월 02일 13시 14분 15.678초 기준 날짜 형변환

 

 - MSSQL 날짜 변환표 (기준날짜를 대상으로 CONVERT 실행하여 날짜 형변환)

번호

쿼리

 결과코드

 0

 CONVERT(CHAR(19), DATETIME, 0)

 01 02 2000 1:14PM MM DD YYYY H:MM

 1

 CONVERT(CHAR(10), DATETIME, 1)

 01/02/2000

 MM/DD/YYYY

 2

 CONVERT(CHAR(8), DATETIME, 2)

 00.01.02

 YY.MM.DD

 3

 CONVERT(CHAR(8), DATETIME, 3)

 02/01/00

 DD/MM/YY

 4

 CONVERT(CHAR(8), DATETIME, 4)

 02.01.00

 DD.MM.YY

 5

 CONVERT(CHAR(8), DATETIME, 5)

 02-01-00

 DD-MM-YY

 6

 CONVERT(CHAR(8), DATETIME, 6)

 02 01 00

 DD MM YY

 7

 CONVERT(CHAR(9), DATETIME, 7)

 01 02, 00

 MM DD, YY

 8

 CONVERT(CHAR(8), DATETIME, 8)

 13:14:15

 HH:MM:SS

 9

 CONVERT(CHAR(26), DATETIME, 9)

 01 02 2000 1:14:15.678PM

 NN DD YYYY H:MM:SS.MS

 10

 CONVERT(CHAR(8), DATETIME, 10)

 01-02-00

 MM-DD-YY

 11

 CONVERT(CHAR(8), DATETIME, 11)

 02/01/00

 DD/MM/YY

 12

 CONVERT(CHAR(6), DATETIME, 12)

 000102

 YYMMDD

 13

 CONVERT(CHAR(24), DATETIME, 13)

 02 01 2000 13:14:15.678

 DD MM YYYY HH:MM:SS.MS

 14

 CONVERT(CHAR(12), DATETIME, 14)

 13:14:15.678

 HH:MM:SS.MS

 20

 CONVERT(CHAR(19), DATETIME, 20)

 2000-01-02 13:14:15

 YYYY-MM-DD HH:MM:SS

 21

 CONVERT(CHAR(23), DATETIME, 21)

 2000-01-02 13:14:15.678

 YYYY-MM-DD HH:MM:SS.MS

 22

 CONVERT(CHAR(20), DATETIME, 22)

 01/02/00 1:14:15 PM

 MM/DD/YY H:M:S

 23

 CONVERT(CHAR(10), DATETIME, 23)

 2000-01-02

 YYYY-MM-DD

 24

 CONVERT(CHAR(8), DATETIME, 24)

 13:14:15

 HH:MM:SS

 25

 CONVERT(CHAR(23), DATETIME, 25)

 2000-01-02 13:14:15.678

 YYYY-MM-DD HH:MM:SS.MS

 100

 CONVERT(CHAR(19), DATETIME, 100)

 01 02 2000 1:02PM

 MM DD YYYY H:MM

 101

 CONVERT(CHAR(10), DATETIME, 101)

 01/02/2000

 MM/DD/YYYY

 102

 CONVERT(CHAR(10), DATETIME, 102)

 2000.01.02

 YYYY.MM.DD

 103

 CONVERT(CHAR(10), DATETIME, 103)

 02/01/2000

 DD/MM/YYYY

 104

 CONVERT(CHAR(10), DATETIME, 104)

 02/01/2000

 DD/MM/YYYY

 105

 CONVERT(CHAR(10), DATETIME, 105)

 02-01-2000

 DD-MM-YYYY

 106

 CONVERT(CHAR(11), DATETIME, 106)

 02 01 2000

 DD MM YYYY

 107

 CONVERT(CHAR(12), DATETIME, 107)

 01 02, 2000

 MM DD, YYYY

 108

 CONVERT(CHAR(8), DATETIME, 108)

 13:14:15

 HH:MM:SS

 109

 CONVERT(CHAR(26), DATETIME, 109)

 01 02 2000 1:14:15.678PM

 MM DD YYYY H:MM:DD.MS

 110

 CONVERT(CHAR(10), DATETIME, 110)

 01-02-2000

 MM-DD-YYYY

 111

 CONVERT(CHAR(10), DATETIME, 111)

 2000/01/02

 YYYY/MM/DD

 112

 CONVERT(CHAR(8), DATETIME, 112)

 20000102

 YYYYMMDD

 113

 CONVERT(CHAR(24), DATETIME, 113)

 02 01 2000 13:14:15.678

 DD MM YYYY HH:MM:DD.MS

 114

 CONVERT(CHAR(12), DATETIME, 114)

 13:14:15:678

 HH:MM:DD:MS

 120

 CONVERT(CHAR(19), DATETIME, 120)

 2000-01-02 13:14:15

 YYYY-MM-DD HH:MM:SS

 121

 CONVERT(CHAR(23), DATETIME, 121)

 2000-01-02 13:14:15.678

 YYYY-MM-DD HH:MM:SS.MS

 126

 CONVERT(CHAR(23), DATETIME, 126)

 2000-01-02T13:14:15.678

 YYYY-MM-DDT HH:MM:SS.MS

 127

 CONVERT(CHAR(23), DATETIME, 127)

 2000-01-02T13:14:15.678

 YYYY-MM-DDT HH:MM:SS.MS

 131

 CONVERT(CHAR(25), DATETIME, 131)

 1/06/1421 1:13:14:678PM

 

 

 [참고사항] 자주 쓰이는 변환표

번호

쿼리

 결과코드

 21

 CONVERT(CHAR(23), DATETIME, 21)

 2000-01-02 13:14:15.678 YYYY-MM-DD HH:MM:SS.MS

 23

 CONVERT(CHAR(10), DATETIME, 23)

 2000-01-02

 YYYY-MM-DD

 112

 CONVERT(CHAR(8), DATETIME, 112)

 20000102

 YYYYMMDD

 

 - 예제 1

 

   오늘 날짜를 YYYY-MM-DD 형태로 CONVERT를 이용하여 표시하시오. (2000년 01월 02일 13시 14분 15초 기준)

 

 

 - 예제 1 쿼리

 

   SELECT CONVERT(CHAR(10), GETDATE()23) AS 날짜

 

 

날짜

2000-01-02

 

 - 예제 2

 

   오늘 날짜를 YYYY-MM-DD HH:MM:SS.MS 형태로 CONVERT를 이용하여 표시하시오. (2000년 01월 02일 13시 14분 15초 기준)

 

 

 - 예제 2 쿼리

 

   SELECT CONVERT(CHAR(23), GETDATE()21) AS 날짜

 

 

날짜

2000-01-02 13:14:15.678

  

 [참고사항] GETDATE()

 

   GETDATE()함수는 오늘날짜를 연, 월, 일, 시, 분, 초, 밀리세컨드까지 갖고 오는 함수입니다.

 

 

출처(http://blog.naver.com/diceworld/220156570441)


Oracle MERGE INTO를 활용해 값이 있는지 확인후 insert , update , delete ,selete 하는 방법 


이전에 포스팅 했던 MSSQL의 EXISTS 기능을 오라클에서 사용하는 방법이다


2016/08/12 - [Yame Programmer/SQL] - [MSSQL] 값이 존재하는지 확인 후 update insert [EXISTS] 활용



MSSQL을 사용했던 프로젝트를 Oracle로 마이그레이션 하게 되면서 다시 사용하게 되었다.


입사 초기에 Oracle를 사용하다 이후 쭉 MSSQL만 써서 기억이 가물가물 했다ㅋㅋ



1. 기본 포맷


1
2
3
4
5
6
MERGE INTO 테이블명  USING ( 서브쿼리 ) 
ON  ( 조건 )
WHEN MATCHED THEN 
조건에 값이 있는 경우 실행할 쿼리 
WHEN NOT MATCHED THEN 
조건에 값이 없는 경우 실행할 쿼리 
cs



2. 간단한 예제


1) 서브쿼리 없이 사용


1
2
3
4
5
6
7
8
9
10
11
12
13
MERGE INTO 
    TABLENAME  
USING DUAL 
    ON (PK_CD = 'PKCD001'  AND DATA_NAME = 'dataName')
    WHEN MATCHED THEN     
        UPDATE SET     
                DATA_COL1 = '업데이트 내용 1',             
                DATA_COL2 = '업데이트 내용 2',             
                DATA_COL3 = '업데이트 내용 3',         
        
    WHEN NOT MATCHED THEN
        INSERT (PK_CD, DATA_NAME,  DATA_COL1, DATA_COL2, DATA_COL3)
        VALUES('PKCD001''dataName''넣을 내용1''넣을 내용3''넣을 내용3')
cs




2) 서브쿼리 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
MERGE INTO 
    TABLE_NAME  TARGETTB
USING(
    SELECT 
        CHECKTB.PK_CD
        ,CHECKTB.DATA_NAME
    FROM
        TABLE_NAME CHECKTB
     LEFT JOIN
        JOIN_TB JT
    ON
        JT.DATA = CHECKTB.DATA 
        ) CHECK
 
    ON (TARGETTB.PK_CD = CHECK.PK_CD    AND   TARGETTB.DATA_NAME = CHECK.DATA_NAME)
    WHEN MATCHED THEN     
        UPDATE SET     
                DATA_COL1 = '업데이트 내용 1',             
                DATA_COL2 = '업데이트 내용 2',             
                DATA_COL3 = '업데이트 내용 3',         
        
    WHEN NOT MATCHED THEN
        INSERT (PK_CD, DATA_NAME,  DATA_COL1, DATA_COL2, DATA_COL3)
        VALUES('PKCD001''dataName''넣을 내용1''넣을 내용3''넣을 내용3')
cs

꼭 INSERT UPDATE만 넣을 수 있는게 아니라 SELECT DELETE를 넣어서 사용 할 수도 있다.




개발자가 DB에서 단순 데이터를 출력하기 위해


오라클에서는 DUAL 이라는 아래와 같이 임시의 가상 테이블을 사용한다.



1
2
3
4
/*Orecle*/

SELECT
    SYSDATE
FROM
    DUAL
cs

오라클에서 단순히 현재 시간데이터만을 출력하기 위한 쿼리이다.


그러나 MS SQL에서는 DUAL이 없다


그렇다면 MSSQL에서는 어떻게 출력해야 하나


답은 아주 간단하다


1
2
/*MS SQL*/

SELECT
    getdate() A
cs


위와같이 작성하면 A라는 컬럼명으로 현재 시간이 나타난다.


어차피 존재하지 않는 테이블이기 때문에 from 테이블명을 사용하지 않고


바로 출력하는 것 같다.


제 포스팅이 도움이 되었나요? 

그렇다면 공감하기 한번 눌러주세요 블로거에게 큰 힘이 됩니다


 다른 테이블과 조인 걸고 삭제[delete] 하기


가끔씩 delete 구문 조건문에 다른 테이블에서 가져온 정보를 넣고 싶을때가 있다.


외래키가 적용이 되어있기 때문에 A라는 테이블의 로우를 삭제 하기 전에  B라는 테이블에 있는


A와 외래키 관계에 있는 정보를 먼저 삭제 한 후 A테이블의 데이터를 삭제 해야 하는 경우가 


그런 경우일 것이다.


다른 테이블과 조인하여 조건을 걸고 데이터를 삭제 하는 방법을 알아보자


1. 일단 삭제 하고자 하는 delete문을 만들어 보자



1
2
3
DELETE FROM
    테이블AA
 
cs



2. 삭제 하고자 하는 내용을 뽑아오는 selete문을 만들어 보자

1
2
3
4
5
6
7
8
9
10
SELECT
    aa.*
FROM
    테이블AA aa
INNER JOIN 
    테이블BB bb
ON
    bb.MENU_ID = aa.MENU_ID
WHERE 
    bb.MENU_ID= '조건'
cs


3. 1번과 2번을 합체!

1
2
3
4
5
6
7
8
9
10
DELTE FROM
    테이블AA
FROM 
    테이블AA aa
INNER JOIN
    테이블BB bb
ON 
    bb.MENU_ID = aa.MENU_ID
WHERE 
    bb.MENU_ID = '조건'
cs



from 이 두번 나와서 이상해 보이지만 저게 맞다.


이렇게 하면 delete문에 다른 테이블과 조인을 걸어서 만든 조건으로 삭제 할 수가 있게 된다.

+ Recent posts