[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 당신은 당신의 최선의 생각입니다 설명한다. 이 때문에 명명 방식과 짧은 별칭 만에 비트 간결한 보이는 ...는 등 같은 테이블에 여러 번 참여하거나 하위 쿼리를 사용하여 때 앨리어싱이 당신의 친구입니다
나는 조금 위로 단지 청소 일을 할 것이다 :
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.하나 PHONE1 또는 (가능성이) phone2가 null이 될 수없는 첫 번째는 좋다. 당신이 왼쪽을 사용하려는 경우에는 대신 내부의 조인.
하나 PHONE1 또는 (가능성이) phone2가 null이 될 수없는 첫 번째는 좋다. 당신이 왼쪽을 사용하려는 경우에는 대신 내부의 조인.
두 개의 전화 번호 필드가있는 테이블이있을 때 보통 나쁜 신호입니다. 일반적으로이 데이터베이스 설계 결함을 의미합니다.
-
==============================
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.내 문제는 없거나 하나 개의 전화 번호가있는 경우에도 기록 (전체 주소록)을 표시하는 것이 었습니다. 따라서 나는 좌 대응하는 오른쪽에있는 경우에도, 왼쪽에서 모든 기록을 소요하지 않는 가입 사용. 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.첫 번째 방법은 적절한 방법이며, 당신이 필요로 할 것입니다. 모두 전화 번호는 표 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 모두있는 경우 발생하는 : 두 번째 방법은 문제가있을 수 있을까? 어떤 행이 선택됩니다? 등의 데이터, 외래 키에 따라이 문제가 될 수도 있고 그렇지 않을 수도 있습니다.
from https://stackoverflow.com/questions/4267929/whats-the-best-way-to-join-on-the-same-table-twice by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL 문자열에 이스케이프 앰퍼샌드 문자 (0) | 2020.04.03 |
---|---|
[SQL] 어떻게 SQL Server에서 월의 일 수를 결정하기 위해? (0) | 2020.04.03 |
[SQL] 어떻게 SQLite 데이터베이스에 날짜 값을 삽입합니까? (0) | 2020.04.03 |
[SQL] 포스트 그레스를 사용하여 한 번에 3 개 테이블의 데이터 삽입 (0) | 2020.04.03 |
[SQL] 조건으로 하위 쿼리에서 삭제 MYSQL (0) | 2020.04.03 |