해결방법을 모르겠습니다.. j 2

by 공부공부 [SQL Query] [2023.01.10 00:45:00]


 

SELECT reviewno, frno, memberno, rating, review_content, r
FROM(
     SELECT reviewno, frno, memberno, rating, review_content, rownum as r
     FROM (
          SELECT reviewno, frno, memberno, rating, review_content
          FROM review
          WHERE frno=3
          ORDER BY reviewno DESC
     )  
)
WHERE r >= 1 AND r <= 3;

 

밑에 SELECT문에서 member테이블의 nickname을 가져온것처럼 위에서도 nickname까지 가져오고싶어서 WHERE문을 바꿔야하는데 계속 오류가 뜹니다, 위에것을 어떻게 바꿔야할까요..?

SELECT r.reviewno, r.frno, r.memberno, r.rating, r.review_content , m.nickname
FROM review r, member m
WHERE r.memberno = m.memberno AND frno=3
ORDER BY r.reviewno ASC;

by pajama [2023.01.10 01:40:47]

안녕하세요. row_number 함수를 쓰셔도 될듯합니다~

 

SELECT reviewno, frno, memberno, rating, review_content , nickname 
FROM (
SELECT r.reviewno, r.frno, r.memberno, r.rating, r.review_content , m.nickname, row_number() over (order by r.reviewno) rn
FROM review r, member m
WHERE r.memberno = m.memberno AND frno=3
)
WHERE rn <=3

 


by 마농 [2023.01.10 08:19:52]
-- 0. 원본 쿼리에 ROWNUM <= 3 조건이 필요합니다. (성능상 중요 포인트)
-- 1. 조인쿼리를 그대로 적용하시면 됩니다.
SELECT reviewno, frno, memberno, rating, review_content, nickname, r
  FROM (SELECT reviewno, frno, memberno, rating, review_content, nickname
             , ROWNUM AS r
          FROM (SELECT r.reviewno, r.frno, r.memberno, r.rating, r.review_content
                     , m.nickname
                  FROM review r
                     , member m
                 WHERE r.frno = 3
                   AND r.memberno = m.memberno
                 ORDER BY r.reviewno DESC
                )
         WHERE ROWNUM <= 3    -- 중요 --
        ) r
 WHERE r >= 1
   AND r <= 3
;
-- 2. 다만 조인 후에 페이징처리 하는 것 보다는 페이징 후에 조인하는게 좋습니다.
-- 3. 페이징 후에 조인을 하게 된다면 조인할때 정렬이 흐트러지지 않도록 주의해야 합니다.
SELECT r.reviewno, r.frno, r.memberno, r.rating, r.review_content, r.r
     , m.nickname
  FROM (SELECT reviewno, frno, memberno, rating, review_content
             , ROWNUM AS r
          FROM (SELECT reviewno, frno, memberno, rating, review_content
                  FROM review
                 WHERE frno = 3
                 ORDER BY reviewno DESC
                )
         WHERE ROWNUM <= 3    -- 중요 --
        ) r
     , member m
 WHERE r.r >= 1
   AND r.r <= 3
   AND r.memberno = m.memberno
 ORDER BY r.r
;
-- 4. 조인 대신 스칼라서브쿼리 형태로 사용하셔도 됩니다.
SELECT reviewno, frno, memberno, rating, review_content, r
     , (SELECT nickname FROM member WHERE memberno = r.memberno) nickname
  FROM (SELECT reviewno, frno, memberno, rating, review_content
             , ROWNUM AS r
          FROM (SELECT reviewno, frno, memberno, rating, review_content
                  FROM review
                 WHERE frno = 3
                 ORDER BY reviewno DESC
                )
         WHERE ROWNUM <= 3    -- 중요 --
        ) r
 WHERE r >= 1
   AND r <= 3
;

 

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