계속 해결방법을 찾으면서 하다가 처리하지 못하여 질문을 드립니다.
현재 SYBASE DB를 사용중이고
inohis 라는 테이블의 데이터를 삭제하려고 합니다.
iobit | trn_date | trn_seq | ino_seq | matrial_no | product | color | btest | weight | yardmeter | in_date | remark | itm_gb |
1 | 20161018 | 1 | 3 | 702 | 3 | 3 | 3 | 3 | 3 | 1 | ||
1 | 20161018 | 1 | 2 | 701 | 2 | 2 | 2 | 2 | 2 | 1 | ||
1 | 20161018 | 1 | 1 | 700 | 1 | 1 | 1 | 1 | 1 | 1 | ||
1 | 20161018 | 1 | 4 | 703 | 4 | 4 | 4 | 4 | 0 | 1 | ||
1 | 20161018 | 1 | 5 | 704 | 5 | 5 | 5 | 5 | 0 | 1 | ||
2 | 20161130 | 1 | 1 | 700 | 1 | 1 | 1 | 1 | 201610 | |||
2 | 20161130 | 1 | 2 | 701 | 2 | 2 | 2 | 2 | 201610 | |||
2 | 20161130 | 1 | 3 | 702 | 3 | 3 | 3 | 3 | 201610 |
iobit 의 1이 입고이고 2가 출고입니다.
출고를 입력을 하면 in_date에 해당 Matrial_no의 left(trn_date,6)이 들어가게 됩니다.
삭제하고자하는 날짜를 20161130로 입력했을 경우 빨간색 행들이 삭제가 되도록 하고 싶습니다.
키는 iobit, trn_date, trn_seq, ino_seq 이지만 무시해도 될 것 같습니다.
inohis 테이블을 self join해서 삭제를 할려고 했는데 잘 되지 않아 질문을 올립니다.
--DELETE FROM inohis SELECT * FROM inohis WHERE (iobit = '2' AND trn_date = '20161130') OR (iobit, trn_date, trn_seq, ino_seq) IN (SELECT b.iobit, b.trn_date, b.trn_seq, b.ino_seq FROM inohis a INNER JOIN inohis b ON b.iobit = '1' AND b.trn_date LIKE CONCAT(a.in_date, '%') AND b.trn_seq = a.trn_seq AND b.ino_seq = a.ino_seq WHERE a.iobit = '2' AND a.trn_date = '20161130' ) ;
IN 절에서 다중컬럼을 지원하지 않는 모양이네요.
Exists 구문으로 바꿔봤습니다.
--DELETE FROM inohis b SELECT * FROM inohis b WHERE (iobit = '2' AND trn_date = '20161130') OR (iobit = '1' AND EXISTS (SELECT 1 FROM inohis a WHERE a.iobit = '2' AND a.trn_date = '20161130' AND a.trn_seq = b.trn_seq AND a.ino_seq = b.ino_seq AND a.in_date = LEFT(b.trn_date, 6) ) ) ;