db를 시작한 지 얼마되지 않은 초짜입니다.
그래서인지 계속 방문해서 질문을 드리게 되네요.
항상 해결해주는 답변을 주셔서 감사합니다.
오늘은 mssql 쿼리문으로 mysql(mariaDB) 쿼리문으로 변경하는 데,
도저히 해결이 되지 않는 상황이라 질문을 드리게 되었습니다.
테이블 1 - testtb_ph
| p_flag | l_num | p_code | flag |
| O | 12345601 | P-3 | Y |
| O | 12345602 | P-3 | Y |
| O | 12345603 | P-3 | Y |
| O | 12345603 | P-3 | Y |
| O | 12345604 | P-3 | Y |
| O | 12345605 | P-3 | Y |
| O | 12345606 | P-3 | Y |
| O | 12345606 | P-3 | Y |
| O | 12345607 | P-2 | Y |
테이블 2 - testtb_pl
| flag | l_num | o_code |
| O | 12345601 | P0000001 |
| O | 12345602 | P0000002 |
| O | 12345603 | P0000003 |
| O | 12345604 | P0000004 |
| O | 12345605 | P0000005 |
| O | 12345606 | P0000006 |
| O | 12345607 | P0000007 |
테이블 3 - testtb_oe
| o_code | i_code |
| P0000006 | I0000001 |
| P0000001 | I0000001 |
| P0000002 | I0000001 |
| P0000003 | I0000001 |
| P0000004 | I0000001 |
| P0000005 | I0000001 |
| P0000007 | J0000002 |
아래 쿼리문은 mssql 입니다. SELECT ROW_NUMBER() OVER(ORDER BY B.o_code DESC) AS ROWNUM, flag, l_num, ISNULL(( SELECT COUNT(*) FROM ( SELECT MAX(FLAG) AS FLAG FROM testtb_ph WHERE l_num = A.l_num AND FLAG = 'Y' GROUP BY p_code) T) , 0) AS pf FROM testtb_pl A LEFT JOIN testtb_oe B ON A.o_code = B.o_code
이에 대한 결과는 아래와 같습니다.
| ROWNUM | flag | l_num | pf |
| 1 | O | 12345607 | 1 |
| 2 | O | 12345606 | 1 |
| 3 | O | 12345605 | 1 |
| 4 | O | 12345604 | 1 |
| 5 | O | 12345603 | 1 |
| 6 | O | 12345602 | 1 |
| 7 | O | 12345601 | 1 |
그런데, mysql(mariaDB) 쿼리문으로 바꿔서 같은 결과를 내고 싶은데,
해결이 되지 않습니다.
어떻게 수정하면 같은 결과를 얻을 수 있을 지 문의드립니다.
항상 해결할 수 있는 답변을 주셔서 감사합니다.
버전은요?
mariaDB 10.3.3.4 입니다.
WITH testtb_ph AS
(
SELECT 'O' p_flag, '12345601' l_num, 'P-3' p_code, 'Y' flag
UNION ALL SELECT 'O', '12345602', 'P-3', 'Y'
UNION ALL SELECT 'O', '12345603', 'P-3', 'Y'
UNION ALL SELECT 'O', '12345603', 'P-3', 'Y'
UNION ALL SELECT 'O', '12345604', 'P-3', 'Y'
UNION ALL SELECT 'O', '12345605', 'P-3', 'Y'
UNION ALL SELECT 'O', '12345606', 'P-3', 'Y'
UNION ALL SELECT 'O', '12345606', 'P-3', 'Y'
UNION ALL SELECT 'O', '12345607', 'P-2', 'Y'
)
, testtb_pl AS
(
SELECT 'O' flag, '12345601' l_num, 'P0000001' o_code
UNION ALL SELECT 'O', '12345602', 'P0000002'
UNION ALL SELECT 'O', '12345603', 'P0000003'
UNION ALL SELECT 'O', '12345604', 'P0000004'
UNION ALL SELECT 'O', '12345605', 'P0000005'
UNION ALL SELECT 'O', '12345606', 'P0000006'
UNION ALL SELECT 'O', '12345607', 'P0000007'
)
, testtb_oe AS
(
SELECT 'P0000006' o_code, 'I0000001' i_code
UNION ALL SELECT 'P0000001', 'I0000001'
UNION ALL SELECT 'P0000002', 'I0000001'
UNION ALL SELECT 'P0000003', 'I0000001'
UNION ALL SELECT 'P0000004', 'I0000001'
UNION ALL SELECT 'P0000005', 'I0000001'
UNION ALL SELECT 'P0000007', 'J0000002'
)
SELECT ROW_NUMBER() OVER(ORDER BY a.o_code DESC) rn
, a.flag
, a.l_num
, SIGN(COUNT(c.l_num)) pf
FROM testtb_pl a
-- LEFT JOIN testtb_oe b
-- ON a.o_code = b.o_code
LEFT JOIN testtb_ph c
ON c.l_num = a.l_num
AND c.flag = 'Y'
GROUP BY a.flag, a.l_num, a.o_code
;
마농님, 감사합니다.
제가 부족하여 아직 제대로 적용시키진 못했지만,
이해하고 아는 데 큰 도움이 되었습니다.
편안한 밤 되세요.