1.SQL에서 AS 뒤에만 명칭을 넣는 것이 아니라 명칭 AS (SELEC …) 형태로도 가능한가 싶었는데
알고보니 WITH 구문을 쓸 때 가상 테이블을 추가할 때만 사용하는 것 같다.
2.문장 도중에 ;가 들어갈 경우 에러가 발생한다.
당연한 내용이지만 FROM xx; 상태로 마무리한 다음
다시 수정할 때 가끔 까먹어서 오류 원인을 못찾을 수 있었다.
3.RECURSIVE를 사용할 때는 UNION ALL을 사용해야 하는 것 같다.
WITH RECURSIVE A AS (
SELECT 1 AS RAN
UNION ALL
SELECT RAN + 1
FROM A
WHERE RAN < 10
)
SELECT RAN
FROM A
4.RECURSIVE 내부 값을 Join으로 엮을 수 있는데
해당 값들의 비교를 위해서는 ID 등 내부 값들도 어떤 테이블에서 가져올지 명시해야한다.
WITH RECURSIVE A AS (
SELECT ID, 1 AS GENERATION
FROM ECOLI_DATA
WHERE PARENT_ID IS NULL
UNION ALL
SELECT b.ID, 1 + a.GENERATION AS GENERATION
FROM ECOLI_DATA b
JOIN A a ON a.ID = b.PARENT_ID
)
SELECT COUNT(ID) COUNT, GENERATION
FROM A c
WHERE (SELECT COUNT(ID)
FROM ECOLI_DATA d
WHERE d.PARENT_ID = c.ID) = 0
GROUP BY GENERATION
5.WITH 가상테이블로 여러개 지정이 가능하고
해당 테이블 내용을 사용하려면 JOIN으로 가져와야 하기 때문에 1=1 같은 조건이라도 넣어야 한다.
WITH FRONT AS (
SELECT SUM(CODE) AS FRONTCODE
FROM SKILLCODES
WHERE CATEGORY = 'Front End'
),
C AS (
SELECT CODE AS CCODE
FROM SKILLCODES
WHERE NAME = 'C#'
),
PYTHON AS (
SELECT CODE AS PCODE
FROM SKILLCODES
WHERE NAME = 'Python'
)
SELECT CASE
WHEN FRONT.FRONTCODE & SKILL_CODE > 0 AND PYTHON.PCODE & SKILL_CODE = PYTHON.PCODE THEN 'A'
WHEN C.CCODE & SKILL_CODE = C.CCODE THEN 'B'
WHEN FRONT.FRONTCODE & SKILL_CODE > 0 THEN 'C'
END AS GRADE,
ID,
EMAIL
FROM DEVELOPERS
INNER JOIN FRONT ON 1=1
INNER JOIN C ON 1=1
INNER JOIN PYTHON ON 1=1
HAVING GRADE IS NOT NULL
ORDER BY GRADE, ID;
6.재귀를 호출할 때 a, b 등 이름 지정을 주의해서 사용해야 한다.
WITH RECURSIVE A AS (
SELECT ID, 1 AS GENERATION
FROM ECOLI_DATA
WHERE PARENT_ID IS NULL
UNION ALL
SELECT b.ID, a.GENERATION + 1 AS GENERATION
FROM ECOLI_DATA b
JOIN A a ON a.ID = b.PARENT_ID
)
SELECT ID
FROM A
WHERE GENERATION = 3
인터페이스 유지보수 요청은 오자마자 짧은 시간에 바로 답변했는데
점점 처리 속도가 빨라지고 있고 프로젝트는 아직 협력사쪽에서 처리중이기 때문에
프로젝트 대기 중 SQL 관련 학습을 하기로 했다.
그 와중에 다시 프로젝트 관련 문의사항이 들어왔는데
개발서버에 필드가 부족한건지 왜 인터페이스가 정상 처리되지 않는지 문의가 왔지만
확인해보니 운영/개발 레코드가 일치하지 않는데 운영에 존재하는 Key를 가져와서 발생한 에러였다.
다른 프로젝트 관련 인터페이스 정의서를 작성해서 보내고 마무리한 다음
위에 작성한 내용의 SQL을 잠깐 공부하고 있었는데
여러개의 프로젝트가 할당중이지만 당장에는 일이 없어보여서 또 하나의 프로젝트에 참여하게 됐다.
팀 인터페이스 프로젝트쪽에서 하는 일을 지원했던 것 중
테스트클래스가 상대방이 완성하지 않아 미뤄뒀던 부분을 그냥 결과 없이 mock http로 처리했고
드디어 자바서버 관련 프로젝트에 추가 할당이 되었는데
이클립스, jdk, 톰캣 등 이것저것 설치하면서 시간을 보내다 보니 다시 인터페이스가 들어왔다.
황당하게도 이전 인터페이스의 반 이상을 갈아엎어야 했는데
사실 기간 협의 도중에 내가 혼자 끝내버린거라 쌍방과실에 가깝기 떄문에
(상대방에서도 정의서만 주고 샘플 데이터 등이 없어서 우리측 정의서에 맞출거라고 생각함)
빠르게 해당 인터페이스를 다시 진행했다.
4시쯤 인터페이스 수정 요청이 들어왔기 떄문에
인터페이스 수정 작업을 진행하다 또 멈추기 싫어서 저녁을 먹고 8시가 넘어서 마무리했다.
예전같으면 인터페이스 하나 처리할 때 짧게는 3일에서 길게는 2주까지도 걸렸던 것 같은데
확실히 경험이 쌓여서 그런건지 아니면 실력도 향상된건지 이제 금방 처리하는게 느껴져서
예전보다는 뭔가 인터페이스에 자신감이 생겼다.
전혀 급한 업무가 아니지만 한번 한건 일정 단계까지 끝내두고 싶어서
인터페이스 업무만 있으면 늦게까지 하다보니 업무가 끝나면 당분간 할일이 없는데
그러면 또 추가 업무를 할당받고 그러면 또 늦게까지 하는게 반복되니 뭔가 이상한 것 같다
(1).백준 10693번 Abdelrahman은 연결된 컴퓨터들 사이에 불필요한 전선의 개수를 찾는 문제였다.
기본 2대는 하나의 선으로 연결된다고 했기 때문에 필요한 전선의 수는 x-1개고
현재 존재하는 전선의 개수는 y개였기 때문에 각각 백틱을 사용해 출력 형태를 맞춰주고
현재 전선의 개수에서 필요한 전선의 개수를 뺀 값을 대입해 출력했다.
const input = `1
4 5`.split('\n')
const result = []
for(let i = 1 ; i < input.length ; i++){
const [x, y] = input[i].split(' ').map(Number)
result.push(`Case ${i}: ${y - x + 1}`)
}
console.log(result.join('\n'))
'회고' 카테고리의 다른 글
[개발일지] - 285(국회의원선거) (0) | 2024.04.10 |
---|---|
[개발일지] - 284 (0) | 2024.04.09 |
[개발일지] - 282(주말) (0) | 2024.04.07 |
[개발일지] - 281(주말) (0) | 2024.04.06 |
[개발일지] - 280 (0) | 2024.04.05 |