col1 | col2 | version | col4 |
a | 123 | 1 | |
a | 456 | 2 | |
a |
111 |
3 | ccc |
a | ccc | ||
a | ccc |
col1가 a이고 version 이용하여 최신 a그룹을 뽑고 싶은데 서브쿼리를 너무 많이 타서 하는거 같은데 다른 방법도 있나요?
select * from t1 where col4 in (select col4 from t1 where col2 = (select col2 from t1 where version = (select max(version) from t1 where col1='a'))
저는 a의 최대 버전값 뽑고 버전을 보고 col2를 뽑고 그걸가지고 col4그룹 값 뽑아서 최종적으로 최신 값들 다 불러왔는데 좀더 간편한 방법이 없을까요?
그리고 정규식에서 aa to bb 뽑을려면 regexp_substr("aa" to "bb", '[^"]+',1,2)||regexp_substr("aa" to "bb", '[^"]+',3,4) 이렇게 하는게 맞나요?
왜 이렇게 복잡한 단계를 거쳐야 하는지 이해가 안가네요.
꼭 이렇게 col1 -> version -> col2 -> col4 단계를 거쳐야 하는 건가요?
중간에 col2 는 빠져도 되는게 아닌가요?
col4 의 ccc 값은 a 에만 있나요? 다른 col1 에 ccc 가 있는 경우는 없는지?
version 도 마찬가지로 3 버전이 다른 코드에도 있을 수 있는데.
a 라는 조건은 매 단계마다 지속적으로 주어야 할 것 같구요.
a 조건이 1단계에만 주어지므로 여러 단계를 거치면서 다른 코드와 섞일 가능성이 보입니다.
정규식 질문도 이해가 안가구요.
쌍따옴표가 왜 나오는지?
aa to bb 뽑는다는게 뭔말인지?
순서는 상관없습니다. col2는 col4를 찾기위해 사용하였습니다.
col1은 문서이름 col2는 문서 버전별 아이디 co3는 문서이름별 버전 col4 col1 그룹 이라고 보시면 될 것 같습니다. (col5추가하면 내용들)
a는 처음 col4일때 and일때 한번더 col1='a' 넣었습니다.
디비구성을 왜 이렇게 한지 모르겠지만 다 떨어져 있는 상태입니다.
정규식 질문은 디비에 "aa" to "bb" 이렇게 쌍따옴표 들어간상태로 있어서
"aa" to "bb" - > aa to bb로 변경 하기위해 바꿔 본 것입니다.
t1테이블 좀더 자세한 부분입니다.
col1 | col2 | version | col4 | col5 |
a | 123 | 1 | aaa | 333 |
a | 456 | 2 | bbb | 444 |
a | 111 | 3 | ccc | 555 |
a | 111 | 3 | ccc | 666 |
a | 111 | 3 | ccc | 777 |
b | 11 | 1 | ee | 888 |
b | 11 | 1 | ee | 999 |
b | 22 | 2 | ff | 1000 |
bb | 22 | 2 | ff | 1200 |
-- 1. 서브쿼리 SELECT * FROM t1 WHERE col1 = 'a' AND version = (SELECT MAX(version) FROM t1 WHERE col1 = 'a') ; -- 2. 조인 SELECT a.* FROM t1 a , (SELECT col1 , MAX(version) version FROM t1 WHERE col1 = 'a' GROUP BY col1 ) b WHERE a.col1 = b.col1 AND a.version = b.version ; -- 3. 분석함수 SELECT * FROM (SELECT col1, col2, version, col4, col5 , RANK() OVER(ORDER BY version DESC) rk FROM t1 WHERE col1 = 'a' ) WHERE rk = 1 ;