복붙노트

[SQL] 어떻게 두 개의 서로 다른 열에 대한 또 다른 SQL 테이블에서 데이터를 일치 얻을 : 내부 가입 및 / 또는 조합?

SQL

어떻게 두 개의 서로 다른 열에 대한 또 다른 SQL 테이블에서 데이터를 일치 얻을 : 내부 가입 및 / 또는 조합?

나는 수업 진행자 그들이 촉진 클래스를 추적 MS Access에서 두 테이블을 가지고있다. 다음과 같이 두 개의 테이블이 구성되어 있습니다 :

tbl_facilitators

facilID -> a unique autonumber to keep track of individual teachers
facilLname -> the Last name of the facilitator
facilFname -> the First name of the facilitator

tbl_facilitatorClasses

classID -> a unique autonumber to keep track of individual classes
className -> the name of the class (science, math, etc)
primeFacil -> the facilID from the first table of a teacher who is primary facilitator
secondFacil -> the facilID  from the first table of another teacher who is backup facilitator

나는 내부가이 형식에서 결과까지 그 당긴 가입 작성하는 방법을 알아낼 수 없습니다 :

Column 1:  Class Name
Column 2:  Primary Facilitator's Last Name
Column 3:  Primary Facilitator's First Name
Column 4:  Secondary Facilitator's Last Name
Column 5:  Secondary Facilitator's First Name

나는 위로 당겨 난 단지 그 자체로 차 촉진제를 요청하거나 단독으로 만 보조 강사를 요청하면 정확한 결과를 얻을 수 있어요. 그래도, 그들 모두가 해결해야 얻을 수 없습니다.

이것은 나의 작업 내부 조인입니다 :

SELECT tbl_facilitatorClasses.className,
    tbl_facilitators.facilLname, tbl_facilitators.facilFname
FROM tbl_facilitatorClasses
INNER JOIN tbl_facilitators
ON tbl_facilitatorClasses.primeFacil = tbl_facilitators.facilID;

절망에서 나는 또한 연합을 시도했지만 내가 기대했던대로 밖으로 작동하지 않았다. 당신의 도움을 크게 감사합니다. 난 정말이 시점에서 어떤 발전을 위해 애 쓰고 있어요. 나는 종종 SQL 작동하지 않습니다.

해결책

덕분에 내가 일하는 결국 다음 쿼리를 내놓았다 @philipxy합니다 :

SELECT tblCLS.className,
    tblP.facilLname, tblP.facilFname, tblS.facilLname, tblS.facilFname
FROM (tbl_facilitatorClasses AS tblCLS
INNER JOIN tbl_facilitators AS tblP
ON tblCLS.primeFacil=tblP.facilID)
INNER JOIN tbl_facilitators AS tblS
ON tblCLS.secondFacil=tblS.facilID;

수행하는 여러 내부는 MS Access에서 조인 할 때, 괄호가 필요하다 ...로서이 다른 게시물에 설명했다.

해결법

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

    1.모든 기본 테이블은 우리가 행을 넣어하거나 생략하는 열 이름에 의해 파라미터 조건 일명 성명 템플릿을,있다. 우리는 SQL 선언처럼 술어에 대한 속기를 사용할 수 있습니다.

    모든 기본 테이블은 우리가 행을 넣어하거나 생략하는 열 이름에 의해 파라미터 조건 일명 성명 템플릿을,있다. 우리는 SQL 선언처럼 술어에 대한 속기를 사용할 수 있습니다.

    // facilitator [facilID] is named [facilFname] [facilLname]
    facilitator(facilID, facilLname, facilFname)
    // class [classID] named [className] has prime [primeFacil] & backup [secondFacil]
    class(classID, className, primeFacil, secondFacil)
    

    술어에 행을 연결하면 제안 일명 성명을 제공합니다. 거짓 제안을 테이블에 진정한 제안의 이동을 행과 행 아웃있어. (그래서 본 테이블은 각 행의 제안을 명시하고 각 행의 존재를 제안 NOT 상태).

    // facilitator f1 is named Jane Doe
    facilitator(f1, 'Jane', 'Doe')
    // class c1 named CSC101 has prime f1 & backup f8
    class(c1, 'CSC101', f1, f8)
    

    그러나 모든 테이블 식 값은 식 당 술어가 있습니다. SQL 그렇게 설계되어 그 테이블 T와 U 행을 (NULL없는 비 중복)을 유지하면 여기서 T (...)와 U (...) (각각) 다음 :

    또한:

    그래서 쿼리에 우리는 (필요한 곳 ​​플러스 조건) 기본 테이블 이름을 사용하여 SQL 년 후, 우리는 기본 테이블 술어를 사용하여 다음 속기에, 기본 테이블 술어를 사용하여 자연 언어에서 원하는 행의 조건을 같이 분석하는 방법을 찾을 수 있습니다. 우리가 두 번 테이블을 언급 할 경우, 우리는 별칭 제공합니다.

    // natural language
    there EXISTS values for classID, primeFacil & secondFacil where
        class [classID] named [className] has prime [primeFacil] & backup [secondFacil]
    AND facilitator [primeFacil] is named [pf.facilFname] [pf.facilLname]
    AND facilitator [secondFacil] is named [sf.facilFname] [sf.facilLname]
    
    // shorthand
    there EXISTS values for classID, primeFacil & secondFacil where
        class(classID,className, primeFacil, secondFacil)
    AND facilitator(pf.facilID, pf.facilLname, pf.facilFname)
    AND pf.facilID = primeFacil
    AND facilitator(sf.facilID, sf.facilLname, sf.facilFname)
    AND sf.facilID = secondFacil
    
    // table names & (MS Access) SQL
    SELECT className, pf.facilLname, pf.facilFname, sf.facilLname, sf.facilFname
    FROM (class JOIN facilitator AS pf ON pf.facilID = primeFacil)
    JOIN facilitator AS sf ON sf.facilID = secondFacil
    

    OUTER 클래스는 항상 두 진행자가 없거나 무언가가 항상 모든 이름이없는 경우에 사용된다 가입하세요. (IE는 열. NULL이 될 수있는 경우) 그러나 당신은 당신의 기본 테이블 및 쿼리 또는 내가 더 널 (null)을지지 않습니다 그래서 일이 NULL이 될 수있는 경우에 대한 비즈니스 규칙에 대한 특정의 조건을 부여하지 않았습니다.

    (재 MS 액세스 괄호는 MS에서 SO에서이 이것을보고 가입하세요.)

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

    2.그냥 여분의 보조 진행자에 대한 참여 (사용 테이블 별칭을하시기 바랍니다!) 않습니다 :

    그냥 여분의 보조 진행자에 대한 참여 (사용 테이블 별칭을하시기 바랍니다!) 않습니다 :

    SELECT fc.className, f1.facilLname, f2.facilFname
    FROM tbl_facilitatorClasses fc
    INNER JOIN tbl_facilitators f1 ON fc.primeFacil = f1.facilID
    INNER JOIN tbl_facilitators f2 ON fc.secondFacil = f2.facilID;
    
  3. ==============================

    3.나는 두 번 tbl_facilitators 테이블에 합류 이상으로 할 것입니다하지만 당신은 두 번째 외부 대신에 가입해야합니다 가입으로 모든 클래스가 정말 제 2의 촉진자가 필요 않는지 확인 할 수 있습니다. 사실 필수 입력란이 아니라고 가정하는 것이 더 안전 할 수 있습니다.

    나는 두 번 tbl_facilitators 테이블에 합류 이상으로 할 것입니다하지만 당신은 두 번째 외부 대신에 가입해야합니다 가입으로 모든 클래스가 정말 제 2의 촉진자가 필요 않는지 확인 할 수 있습니다. 사실 필수 입력란이 아니라고 가정하는 것이 더 안전 할 수 있습니다.

  4. from https://stackoverflow.com/questions/27682228/how-to-get-matching-data-from-another-sql-table-for-two-different-columns-inner by cc-by-sa and MIT license