복붙노트

[SQL] 두 번 같은 테이블에 가입하는 가장 좋은 방법은 무엇입니까?

SQL

두 번 같은 테이블에 가입하는 가장 좋은 방법은 무엇입니까?

이 복잡 ​​조금,하지만 난 두 테이블을 가지고있다. 하자는 구조가 같은 것을 말한다 :

*Table1*
ID
PhoneNumber1
PhoneNumber2

*Table2*
PhoneNumber
SomeOtherField

> Table2.Phone 번호, 또는 Table1.PhoneNumber2 - -> Table2.Phone 번호 테이블은 표 1.PhoneNumber 1을 기준으로 가입 할 수있다.

지금, 나는이 PhoneNumber1 포함 된 결과 집합을 얻으려면, SomeOtherField 그 PhoneNumber1, PhoneNumber2 및 SomeOtherField에 해당 PhoneNumber2에 해당.

두 번 테이블에 합류하여, 또는 한 번에 가입하여 또는 ON 절에 중 -이 작업을 수행하는 두 가지 방법으로 생각했다.

방법 1 :

SELECT t1.PhoneNumber1, t1.PhoneNumber2, 
   t2.SomeOtherFieldForPhone1, t3.someOtherFieldForPhone2
FROM Table1 t1
INNER JOIN Table2 t2
   ON t2.PhoneNumber = t1.PhoneNumber1
INNER JOIN Table2 t3
   ON t3.PhoneNumber = t1.PhoneNumber2

이 일 것으로 보인다.

방법 2 :

어떻게 든이 같은 약간 보이는 쿼리를해야합니다 -

SELECT ...
FROM Table1
INNER JOIN Table2 
   ON Table1.PhoneNumber1 = Table2.PhoneNumber OR
      Table1.PhoneNumber2 = Table2.PhoneNumber

아직 작업이를 못하고 나는 확실히 그것을 할 수있는 방법이 있는지 모르겠어요.

이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 어느 방법이 할 수있는 더 간단한 방법이 있나요 ... 단순하거나 직관적 인 것 같다? 이 요구 사항은 일반적으로 어떻게 구현?

해결법

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

    1.첫째, 나는 시도하고 자연 키로 전화 번호를 사용하여 멀리 얻을이 ​​테이블을 리팩토링 것입니다. 나는 자연 키의 팬이 아니다이 왜 좋은 예입니다. 자연 키, 전화 번호와 같은 특히 일이 자주 있으므로 변경할 수 있습니다. 데이터베이스를 업데이트하는 변화는 거대한, 오류가 발생하기 쉬운 두통이있을 것이다 일어날 때. *

    첫째, 나는 시도하고 자연 키로 전화 번호를 사용하여 멀리 얻을이 ​​테이블을 리팩토링 것입니다. 나는 자연 키의 팬이 아니다이 왜 좋은 예입니다. 자연 키, 전화 번호와 같은 특히 일이 자주 있으므로 변경할 수 있습니다. 데이터베이스를 업데이트하는 변화는 거대한, 오류가 발생하기 쉬운 두통이있을 것이다 일어날 때. *

    방법 1 당신은 당신의 최선의 생각입니다 설명한다. 이 때문에 명명 방식과 짧은 별칭 만에 비트 간결한 보이는 ...는 등 같은 테이블에 여러 번 참여하거나 하위 쿼리를 사용하여 때 앨리어싱이 당신의 친구입니다

    나는 조금 위로 단지 청소 일을 할 것이다 :

    SELECT t.PhoneNumber1, t.PhoneNumber2, 
       t1.SomeOtherFieldForPhone1, t2.someOtherFieldForPhone2
    FROM Table1 t
    JOIN Table2 t1 ON t1.PhoneNumber = t.PhoneNumber1
    JOIN Table2 t2 ON t2.PhoneNumber = t.PhoneNumber2
    

    제가 한:

    * 한 가지 방법은 DBA가 자연 키를 업데이트하는 두통을 방지하는 것은 기본 키와 가난한 DB 설계와 더 화합물 문제 외래 키 제약 조건을 지정하지 않는 것입니다. 사실 더 자주 못하는 것보다이를 보았다.

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

    2.하나 PHONE1 또는 (가능성이) phone2가 null이 될 수없는 첫 번째는 좋다. 당신이 왼쪽을 사용하려는 경우에는 대신 내부의 조인.

    하나 PHONE1 또는 (가능성이) phone2가 null이 될 수없는 첫 번째는 좋다. 당신이 왼쪽을 사용하려는 경우에는 대신 내부의 조인.

    두 개의 전화 번호 필드가있는 테이블이있을 때 보통 나쁜 신호입니다. 일반적으로이 데이터베이스 설계 결함을 의미합니다.

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

    3.두 조인을 결합하는 UNION을 사용할 수 있습니다 :

    두 조인을 결합하는 UNION을 사용할 수 있습니다 :

    SELECT Table1.PhoneNumber1 as PhoneNumber, Table2.SomeOtherField as OtherField
      FROM Table1
      JOIN Table2
        ON Table1.PhoneNumber1 = Table2.PhoneNumber
     UNION
    SELECT Table1.PhoneNumber2 as PhoneNumber, Table2.SomeOtherField as OtherField
      FROM Table1
      JOIN Table2
        ON Table1.PhoneNumber2 = Table2.PhoneNumber
    
  4. ==============================

    4.내 문제는 없거나 하나 개의 전화 번호가있는 경우에도 기록 (전체 주소록)을 표시하는 것이 었습니다. 따라서 나는 좌 대응하는 오른쪽에있는 경우에도, 왼쪽에서 모든 기록을 소요하지 않는 가입 사용. Microsoft Access에서 SQL에서이 작품은 (그들이 괄호가 필요합니다!) 나를 위해

    내 문제는 없거나 하나 개의 전화 번호가있는 경우에도 기록 (전체 주소록)을 표시하는 것이 었습니다. 따라서 나는 좌 대응하는 오른쪽에있는 경우에도, 왼쪽에서 모든 기록을 소요하지 않는 가입 사용. Microsoft Access에서 SQL에서이 작품은 (그들이 괄호가 필요합니다!) 나를 위해

    SELECT t.PhoneNumber1, t.PhoneNumber2, t.PhoneNumber3
       t1.SomeOtherFieldForPhone1, t2.someOtherFieldForPhone2, t3.someOtherFieldForPhone3
    FROM 
    (
     (
      Table1 AS t LEFT JOIN Table2 AS t3 ON t.PhoneNumber3 = t3.PhoneNumber
     )
     LEFT JOIN Table2 AS t2 ON t.PhoneNumber2 = t2.PhoneNumber
    )
    LEFT JOIN Table2 AS t1 ON t.PhoneNumber1 = t1.PhoneNumber;
    
  5. ==============================

    5.첫 번째 방법은 적절한 방법이며, 당신이 필요로 할 것입니다. 모두 전화 번호는 표 2에 존재하는 경우, 내부 조인과 함께, 당신은 단지 표에서 행을 선택합니다. 당신은 LEFT하고 싶지 표에서 모든 행을 선택했는지 너무 가입 할 수있다. 전화 번호가 일치하지 않는 경우, SomeOtherFields는 널 (null) 일 것이다. 당신이 있는지 확인하려면 t2.PhoneNumber IS NOT NULL 또는 t3.PhoneNumber가 NULL이 WHERE 당신은 당신이 다음 할 수있는 적어도 하나 개의 일치하는 전화 번호를

    첫 번째 방법은 적절한 방법이며, 당신이 필요로 할 것입니다. 모두 전화 번호는 표 2에 존재하는 경우, 내부 조인과 함께, 당신은 단지 표에서 행을 선택합니다. 당신은 LEFT하고 싶지 표에서 모든 행을 선택했는지 너무 가입 할 수있다. 전화 번호가 일치하지 않는 경우, SomeOtherFields는 널 (null) 일 것이다. 당신이 있는지 확인하려면 t2.PhoneNumber IS NOT NULL 또는 t3.PhoneNumber가 NULL이 WHERE 당신은 당신이 다음 할 수있는 적어도 하나 개의 일치하는 전화 번호를

    표 2는 PhoneNumber1 및 PhoneNumber2 모두있는 경우 발생하는 : 두 번째 방법은 문제가있을 수 있을까? 어떤 행이 선택됩니다? 등의 데이터, 외래 키에 따라이 문제가 될 수도 있고 그렇지 않을 수도 있습니다.

  6. from https://stackoverflow.com/questions/4267929/whats-the-best-way-to-join-on-the-same-table-twice by cc-by-sa and MIT license