[mariadb] insert into 쿼리문 점검 부탁드립니다. 0 2 3,860

by tosswin [SQL Query] mariadb insert [2024.02.21 16:41:16]


q_code q_seq i_code rdata1 rdata2 note
T-01 1 I-01 110.0 120.0 test-01
T-01 2 I-01 120.0 130.0 test-01

rdata1과 rdata2의 이력을 남겨두기 위해 위와 같은 방법을 사용하고 있습니다.

q_code, q_seq, i_code 는 primary key이며,

note 는 not null로 설정하였습니다.

 

그리고, 사용하는 기본 쿼리문은 다음과 같습니다.

INSERT INTO tb_code
(
  q_code, 
  q_seq, 
  i_code, 
  rdata1, 
  rdata2, 
  note
)
select 
  'T-01' as q_code, 
  coalesce(max(q_seq) + 1, 1) as q_seq, 
  'I-01' as i_code, 
  '120.0' as rdata1, 
  '130.0' as rdata2, 
  coalesce(note, 'test-01') as note
from tb_code 
where q_code = 'T-01' 
  and i_code = 'I-01'

위의 쿼리문을 사용하면 q_seq가 증가하면서 insert가 원하는 대로 되고 있습니다.

 

그런데, 위의 테이블에서 없는 q_code나 i_code를 사용하려고 하면,

note can not be null 이라는 에러가 발생합니다.

이 때 사용하는 query 문은 아래와 같습니다.

INSERT INTO tb_code
(
  q_code, 
  q_seq, 
  i_code, 
  rdata1, 
  rdata2, 
  note
)
select 
  'T-01' as q_code, 
  coalesce(max(q_seq) + 1, 1) as q_seq, 
  'I-02' as i_code, 
  '210.0' as rdata1, 
  '220.0' as rdata2, 
  coalesce(note, 'test-02') as note
from tb_code 
where q_code = 'T-01' 
  and i_code = 'I-02'

위의 query를 사용하면 원하는 결과는 

q_code q_seq i_code rdata1 rdata2 note
T-01 1 I-01 110.0 120.0 test-01
T-01 2 I-01 120.0 130.0 test-01
T-01 1 I-02 210.0 220.0 test-02

note의 값은 q_seq 값이 1인 경우에만 insert를 하고

q_seq 값이 2 이상이면 q_seq 값이 1이였을 때 값을 계속 사용하고자 합니다.

 

어떻게 해결할 수 있는 지 부탁드립니다.

 

감사합니다.

 

by 마농 [2024.02.21 17:39:42]

집계 쿼리에서 note 를 집계함수 없이 단독으로 사용한 것은 표준에 어긋나는 사용법입니다.
MariaDB, MySQL 에서는 이 구문이 오류 없이 동작을 하죠.
하지만 이러한 비표준 구문은 지양되어야 할 사용법 입니다.

여러개의 note 중에 어떤 값이 나와야 할지 정해지지가 않습니다.
아무값이나 나오게 되겠지요?
아마도 첫번째 값이 나올 것 같기는 합니다.

어떤값을 원하는 걸까요?
정말로 아무값이나 원한다면?
집계함수로 한번 감싸 주면 됩니다.
MIN(note), MAX(note), ANY_VALUE(note)
 


by tosswin [2024.02.22 09:07:11]

감사합니다. 마농님.

제가 사용한 query가 집계함수라는 생각도 하지 못했네요.

가르쳐주신 방법 중에 min을 사용하여 적용을 완료했습니다.

도움을 주셔서 감사합니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입