1 : N 테이블 구조. 0 14 2,005

by 한번사는인생 [SQLServer] [2023.02.06 10:46:17]


A / B 테이블이 있는데, 1:N으로 설계되어 있습니다.
A 테이블을 기준으로 리스트를 조회하기 위해서 조인을 어떻게 걸어야 할까요?
현재는 LEFT OUTER JOIN 후, GROUP BY 혹은 DISTINCT 하고 있습니다.

그리고 B 테이블에 만족하는 테이블을 조건은 아래처럼 처리하고 있습니다.

SELECT (GROUP BY 컬럼)
FROM A
    LEFT OUTER JOIN B
    ON 조건.
WHERE EXISTS (
        SELECT 1
        FROM B
        WHERE B.조건 
    )
GROUP BY 컬럼

 

문제는 없지만, 조금 더 효율적으로 개발하고 싶어서 문의드립니다.

by 마농 [2023.02.06 11:08:13]

B 를 왜 두번 사용하나요?
한번만 사용하도록 개선해야 할 듯 합니다.


by 한번사는인생 [2023.02.06 11:29:52]

일단 제가 전문적으로 DB를 하는게 아니라,

질문이 모호했던 점 죄송합니다!

 

1:N인 테이블을 조회할때 최적화된 조회 방법이 궁금했습니다.


by 마농 [2023.02.06 13:11:41]

지금 올려주신 쿼리 기준으로 답변드리자면.
이미 답변 드렸지만. 테이블 2회 사용을 1회 사용으로 줄이는게 좋습니다.
더 구체적인 답변을 원한다면? 질문이 더 구체적이어야 합니다.
지금 질문은 너무 포괄적, 추상적입니다.


by 한번사는인생 [2023.02.06 13:31:13]

마농님 고맙습니다.

다시 제대로 생각하고 질문하겠습니다!


by 우주민 [2023.02.06 16:05:35]

1. A 테이블을 B 테이블과 조인 하는 로직

2. 조회 조건은 B 테이블의 컬럼을 사용

이라는 조건을 상정한다면...

  - A 컬럼만을 사용할 경우 : EXISTS 구문 이용

  - B 컬럼을 사용할 경우 : LEFT JOIN 후 해당 컬럼의 집합함수 등을 이용

제가 일반적으로 사용하는 방법일 뿐이니 참조 하시면 될거 같네요.


by 한번사는인생 [2023.02.07 09:21:50]

개떡같이 말했는데, 찰떡같이 알아주셔서 고맙습니다.

그러면 B컬럼을 2개 이상 조건을 주고 싶을때는 EXISTS 문이 2개 이상으로 설정하시나요?


by 우주민 [2023.02.07 09:37:52]

EXISTS 내부의 B 테이블에 해당 조건들을 기술하면 됩니다.


by 한번사는인생 [2023.02.07 10:21:49]

아....

엄청 간단한건데, 왜 그 생각을 못했는지 모르겠네요ㅠㅜ

고맙습니다.


by 마농 [2023.02.07 11:39:51]

효율적인 쿼리를 질문하시길래 성능관점으로 보고 답변 드린 것인데.
성능 관점으로 보려면 여러가지 상황을 고려하여 그때 그때 다른 결과가 나옵니다.
즉 주어진 상황에 맞는 해결책이 다 다르기 때문에 구체적 상황을 요청드린 것인데요.
그러나, 질문은 그냥 성능이 아닌 원하는 결과를 뽑는 구문에 대한 질문이었던 것 같네요.
1. 조인 후 중복제거하는 방법도 있고
2. 서브쿼리 조건을 이용하는 방법도 있습니다.
- 서브쿼리는 EXISTS 만 해당되는게 아니고 IN 절로도 구현 가능합니다.
 

SELECT DISTINCT d.deptno, d.dname
  FROM dept d
 INNER JOIN emp e
    ON e.deptno = d.deptno
 WHERE e.job = 'CLERK'
   AND e.sal < 2000
;

SELECT d.deptno, d.dname
  FROM dept d
 WHERE d.deptno IN (SELECT e.deptno
                      FROM emp e
                     WHERE e.job = 'CLERK'
                       AND e.sal < 2000
                    )
;

SELECT d.deptno, d.dname
  FROM dept d
 WHERE EXISTS (SELECT 1
                 FROM emp e
                WHERE e.job = 'CLERK'
                  AND e.sal < 2000
                  AND e.deptno = d.deptno
               )
;

 


by 한번사는인생 [2023.02.07 11:53:12]

오 고맙습니다.ㅠㅜ

그때그때마다 상황이 다르겠지만,

마농님은 중복제거와 IN혹은EXISTS 방식 중에 어떠한 방식을 선호하시는지 물어봐도 될까요?


by 마농 [2023.02.07 13:10:30]

그때 그때 달라요.


by 한번사는인생 [2023.02.07 13:35:23]

그때그때 다른 기준에 대한 간략하게 설명이 안되시겠지만,

간략하게 설명해주실 수 있을까요?

저는 기준이 없다보니, 막 쓸거 같다는 생각이 듭니다.ㅠㅜ


by 마농 [2023.02.07 14:26:12]

조건 항목이 어떤 테이블의 어떤 항목들인지?
조회 항목은 어떤 테이블의 어떤 항목인지?
사용하는 항목의 특성이 어떠한지?
적절한 인덱스는 존재하는지?
테이블 간의 관계는 어떻게 되는지?
데이터량이 어느정도인지? 전체 데이타량, 조건을 만족하는 데이터량. 조인 결과 데이터량 등
페이징 처리가 필요한지?
조건은 필수조건인지? 가변 조건인지?
등등등 헤아릴 것이 많습니다.

구체적인 상황이 특정된다면 그에 대한 설명은 가능하지만.
전반적으로 그때 그떄 상황에 따른 설명을 해달라고 하시면.
저는 간략하게 설명드릴 자신이 없습니다.


by 한번사는인생 [2023.02.07 15:18:13]

알겠습니다!

항상 좋은 정보 얻어 갑니다.

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