복붙노트

[SQL] 3 개 이상의 테이블이 포함 된 경우 작품을 가입하는 방법을 이해. [SQL]

SQL

3 개 이상의 테이블이 포함 된 경우 작품을 가입하는 방법을 이해. [SQL]

SQL에서 조인 사람 캔 도움말 내 이해를 증진 있을까. [이 문제에 의미가 있다면, 내가 특별히 MS SQL 서버를 생각하고있다.]

테이블 (3) A, B [B가 어떤 A.AId 관련된 A] 및 C [B.BId 일부가 C와 관련된 B]를 가지고

만약 내가 작성 쿼리 예 :

SELECT *
FROM A JOIN B 
ON A.AId = B.AId

모든 좋은 - 나는 어떻게이 작품 달콤한입니다.

어떻게됩니까 때 표 C (또는 다른 D, E, ... 추가됩니다)

상황에서

SELECT *
FROM A JOIN B 
  ON A.AId = B.AId
JOIN C ON C.BId = B.BId

무엇 C는에 합류? - B는 그 테이블 (그리고 그 내부 값)? 아니면은 C 테이블에 가입되어 가입하는 A + B의 결과 다른 임시 결과 세트입니까?

[함축 B는 테이블에있는 모든 값은 필요에 기초하여 A + B 설정된 임시 결과에 있지 않은 것이 조인 조건을, B]

내가 다음에보고하고 행동을 이해하려고하기 때문에 내가 부탁하고 왜 특정 (그리고 매우 인위적인) 예입니다 :

Tables 
Account (AccountId, AccountBalanceDate, OpeningBalanceId, ClosingBalanceId)
Balance (BalanceId)
BalanceToken (BalanceId, TokenAmount)

Where:
Account->Opening, and Closing Balances are NULLABLE 
(may have opening balance, closing balance, or none)

Balance->BalanceToken is 1:m - a balance could consist of many tokens

개념적으로, 날짜의 균형을 닫기, 잔액 내일 것

나는 계정에 대한 모든 개구의 목록과 폐쇄 균형을 찾기 위해 노력 경우

내가 좋아하는 뭔가를 할 수

SELECT AccountId
, AccountBalanceDate
, Sum (openingBalanceAmounts.TokenAmount) AS OpeningBalance
, Sum (closingBalanceAmounts.TokenAmount) AS ClosingBalance
FROM Account A 
   LEFT JOIN BALANCE OpeningBal 
      ON A.OpeningBalanceId = OpeningBal.BalanceId
   LEFT JOIN BALANCE ClosingBal 
      ON A.ClosingBalanceId = ClosingBal.BalanceId
   LEFT JOIN BalanceToken openingBalanceAmounts 
      ON openingBalanceAmounts.BalanceId = OpeningBal.BalanceId
   LEFT JOIN BalanceToken closingBalanceAmounts 
      ON closingBalanceAmounts.BalanceId = ClosingBal.BalanceId
   GROUP BY AccountId, AccountBalanceDate  

나는 결과에 중복으로 끝낼 - 마지막 닫는 균형 토큰에 제공 가입 때까지 기대 겼고 작동합니다.

[나는 DISTINCT로 해결할 수 있습니다 -하지만 난 어떤 일이 일어나고 것은 일어나고있는 이유를 이해하려고 노력하고 있어요]

내가 마지막에 가져올 때 3가 이미에 BalanceIds에서 여러 번 가져왔다 JOIN 때문에 (나는 가정) 내가 얻고 중복 가입하는 것이 - M : I는 균형 사이의 관계, 그리고 BalanceToken 1이기 때문에 문제가 들었습니다 임시 결과 세트입니다.

나는 예를 들어 테이블이 좋은 DB 디자인을 준수하지 않는 것을 알고있다

어떤 깨달음에 대한 에세이에 대한 죄송합니다, 감사합니다 :)

MARC BY 질문에 응답 편집

개념적으로 계정을 (AccountingDate 당) 계정에 대한 BalanceToken에서 중복이 안 - 1 개 계정 / AccountingDates가 균형을 닫기 때문에하는 것은 다음 날 그 계정 잔액이에 대한 내 생각에 문제가 온다 - 자기 밸런스, BalanceToken에 합류 그렇게 할 때 여러 번 개폐 균형을 얻기 위해 나는 균형 (BalanceId의)가 '결과 믹스'하게되고 여러 번 생각합니다. 그것은 제 2 예를 명확히하는 데 도움이 경우 일일 조정으로 생각 - 따라서 결합의 왼쪽 - 개구 (및 / 또는) 밸런스를 폐쇄하는 것은 주어진 계정 / accountingdate 조합에 대해 계산 된 수 없다.

해결법

  1. ==============================

    1.개념적으로 여기 함께 세 개의 테이블을 조인 할 때 발생하는 것입니다.

    개념적으로 여기 함께 세 개의 테이블을 조인 할 때 발생하는 것입니다.

    이것은 무슨 개념이다. 길을 따라 여러 가지 최적화가 가리키고. 관계형 모델의 장점은 정확성을 변경하지 않으면 서 음성 수학적 기초 플랜의 다양한 변환을 가능하게한다는 것이다.

    예를 들어, 정말 그 길을 따라 전체 결과 세트를 생성이 필요하지 아니합니다. 순서에 대신 처음에 인덱스를 이용하여 데이터 액세스를 통해 수행 될 수있다. 그뿐만 아니라 수행 할 수 있습니다 조인의 종류가 많이 있습니다.

  2. ==============================

    2.우리는 B의 데이터는 (내부)에 의해 필터링 될 것 A (A의 데이터도 여과)에 가입되어 있음을 알고있다. 우리는 (내부)은 C를 B에서 합류한다면, 따라서 세트 C는 A. 그리고 가입 어떠한 중복이 포함된다는 것을 또한주의의 관계에 의해 필터링된다.

    우리는 B의 데이터는 (내부)에 의해 필터링 될 것 A (A의 데이터도 여과)에 가입되어 있음을 알고있다. 우리는 (내부)은 C를 B에서 합류한다면, 따라서 세트 C는 A. 그리고 가입 어떠한 중복이 포함된다는 것을 또한주의의 관계에 의해 필터링된다.

    하나; 이 최적화까지입니다에 무슨 주문; 그것은 /를 B를하기로 결정 수 C는 먼저 A, 또는 다른 어떤 순서 (각 가입에서 아마 예상 행 수에 따라 적절한 인덱스)를 소개 조인.

    하나; 당신 나중에 예제에서 당신은 왼쪽 외부 조인을 사용; 계정 때문에 전혀 필터링되지 않으며, 다른 테이블의 여러 일치하는 경우도 내 복제 할 수 있습니다.

    BalanceToken에서 (계정 당)이 중복이 있습니까?

  3. ==============================

    3.나는 종종 실제 실행 계획을 확인하는 데 도움이 찾을 수 있습니다. 쿼리 분석기 / 관리 스튜디오에서는 쿼리 메뉴에서 쿼리에이 설정, 또는 Ctrl + M을 사용할 수 있습니다. 쿼리를 실행 한 후, 실행 된 계획은 다른 결과 탭에 표시됩니다. 이것에서 당신은 C와 B가 먼저 합류 된 후 결과가 A로 결합되는 것을 볼 수 있습니다 둘 다 내부, 그것을 만드는 조인 때문에 DBMS는이 A-및-B를-와-C의 정보에 따라 달라질 수 있습니다 계획 . 내 말은 결과에 관계없이 처음 가입하는의도 동일하게 나타날 것이라고는하지만, 걸리는 시간이 크게 다를 수 있습니다, 그리고 최적화와 힌트가 활동하기 시작하는 곳이다.

    나는 종종 실제 실행 계획을 확인하는 데 도움이 찾을 수 있습니다. 쿼리 분석기 / 관리 스튜디오에서는 쿼리 메뉴에서 쿼리에이 설정, 또는 Ctrl + M을 사용할 수 있습니다. 쿼리를 실행 한 후, 실행 된 계획은 다른 결과 탭에 표시됩니다. 이것에서 당신은 C와 B가 먼저 합류 된 후 결과가 A로 결합되는 것을 볼 수 있습니다 둘 다 내부, 그것을 만드는 조인 때문에 DBMS는이 A-및-B를-와-C의 정보에 따라 달라질 수 있습니다 계획 . 내 말은 결과에 관계없이 처음 가입하는의도 동일하게 나타날 것이라고는하지만, 걸리는 시간이 크게 다를 수 있습니다, 그리고 최적화와 힌트가 활동하기 시작하는 곳이다.

  4. ==============================

    4.까다로울 수있다 조인, 그리고 행동의 대부분은 물론 데이터가 실제 테이블에 저장되는 방식에 의해 결정됩니다.

    까다로울 수있다 조인, 그리고 행동의 대부분은 물론 데이터가 실제 테이블에 저장되는 방식에 의해 결정됩니다.

    테이블을 보지 않고는 특정 경우에 명확한 대답을하기 어렵다하지만 기본적인 문제는 당신이 하나로 결합되는 여러 결과 집합을 합한 것을 생각합니다.

    아마도 대신 여러 당신이 다음 계정 ID와 날짜에 두 합류, 쿼리, openingbalances의 계정 아이디, 날짜와 합 하나, 폐쇄 균형의 계정 아이디, 날짜, 합계와 두 번째에 두 개의 임시 테이블을 만들어야합니다 합류했다.

    조인과 특정의 경우에도, 무슨 일이 일어나고 정확히 알아 내기 위해, 나는 다음을 수행합니다 :

    초기 일부 변경

    openingbalance 같은 SELECT accountID가 Accountbalancedate, SUM (...) FROM closingbalance 같은 합 (...)

    단순히

    "*을 화상에서 선택"

    결과 테이블을 공부하고 데이터가 중복되는 것을 정확히 볼 수 있습니다. (가) 하나 하나를 조인 제거하고 무슨 일이 일어 나는지. 이렇게하면 그것이 속는를 일으키는 특정 데이터에 대해 무엇인지에 대한 단서를 제공해야합니다.

    당신은 SQL 서버 관리 스튜디오에서 쿼리를 (무료 버전이 존재하는) 열 경우에 당신은 디자이너에서 쿼리를 편집 할 수 있습니다. 테이블이 또한 도움이 될 결합되는 방법의 시각적보기는 무슨 일이 일어나고 있는지 알고 있습니다.

  5. from https://stackoverflow.com/questions/1083676/understanding-how-join-works-when-3-or-more-tables-are-involved-sql by cc-by-sa and MIT license