2014-03-27 2 views
0

고유 ID와 함께 특정 설명이 포함 된 설명 테이블이 있습니다. 이 테이블에 두 개의 외래 키가 들어있는 다른 테이블이 있습니다. 두 개의 테이블을 두 개의 외래 키로 결합합니다.

SELECT 
Description.description AS Description, 
Object.objID AS ID, 
Description.description AS Location 
FROM 
Object 
INNER JOIN 
Description 
ON 
Object.objDescID=Description.descID 
AND 
Object.objLocID=Description.descID; 

그러나이 작동하지 않는 사람이 올바른 방향으로 날 지점 수 있습니다하십시오 : 지금까지 난 다음 쿼리를?

SELECT 
D.description AS `Description`, 
O.objID AS `ID`, 
D.description AS `Location` 
FROM 
`Object` O 
INNER JOIN 
Description D 
ON 
O.objDescID=D.descID 
AND 
O.objLocID=D.descID; 
+1

이 작동하지 않습니까? 약간의 오류? –

+0

마지막 'AND' 절을 수정해야합니다. – SoulTrain

+1

Joe Meyer가 올바른 방향으로 여러분을 지적했습니다. 그의 대답은 본질적으로 내 것과 같습니다. Description 테이블에 ** 두 개의 별도 참조가 필요합니다. lookup objDesc에 대한 참조 하나, objLoc을 조회 할 다른 하나. Description 테이블에 대한 참조 중 하나에 별칭을 사용하여 별표를 구분해야하는 경우입니다. – spencer7593

답변

2

난 당신이 동일한 개체를 두 번 설명 테이블에 가입 할 권리 이해한다면 :

+0

+1. 'Description' 테이블을 두 개의 다른 ** 테이블처럼 다루어야합니다. 우리는 하나로부터 objDesc를 얻고, 다른 하나는 objLoc을 얻습니다. – spencer7593

+0

이제 오류 1054 (42S22) 오류가 발생했습니다 : 'on 절'에 'Description.descID'알 수없는 열 – JH95

+0

on 절의 별칭 테이블 이름을 반영하도록 쿼리를 업데이트했습니다. –

-1

그 때문에

이 시도 부여 테이블 이름의의, 느낌이 있어요 . , 당신은 당신이 LEFT를 사용한다 널 외부 키를 허용하면 충고 한마디, 대신 내부 조인의 가입이 주사를주고 당신을 얻는 경우에 후 당신이있어 무엇을 참조하십시오

SELECT 
    Object.objID AS ID, 
    od.description AS Description, 
    ld.description AS Location 
FROM Object 
    INNER JOIN Description AS od 
    ON Object.objDescID=od.descID 
    INNER JOIN Description AS ld 
    ON Object.objLocID=ld.descID; 

편집 방법 중 하나가 null이면 전체 레코드가 표시되지 않습니다. 이 실행

0

봅니다 (약간의 조정이 필요할 수 있습니다) : 당신이 Description 테이블 참조를 필요로 같은

SELECT 
Description.description AS Description, 
Object.objID AS ID, 
Description.description AS Location 
FROM 
Object 
INNER JOIN 
Description AS Object.objDescID=Description.descID 
INNER JOIN 
Description AS Object.objLocID=Description.descID; 
+0

이것은 유효한 구문이 아닙니다. 접근 방식은 옳습니다. 설명 테이블에 대한 ** 두 개의 ** 참조가 필요하지만 쿼리에 대한 변경 사항은 충분하지 않습니다. 변경 사항이 적용된 이유에 대한 설명은 간단합니다. – spencer7593

0

보인다. 각 참조는 외래 키 열 중 하나를 사용하여 조인됩니다. 예를 들어

:

SELECT o.objID  AS `ID` 
    , d.description AS `Description` 
    , l.description AS `Location` 
FROM Object o 
JOIN Description d 
    ON d.descID = o.objDescID 
JOIN Description l 
    ON l.descID = o.objLocID 

우리는 우리의 Description 가치를 소스로 짧은 별칭 d을 할당합니다.

짧은 별칭 l을 소스에 할당하면 Location 값이 나타납니다.

테이블 이름 대신 짧은 별칭을 사용하여 각 테이블의 열을 참조합니다.

기본적으로 실제로 동일한 테이블 일지라도 두 개의 다른 테이블처럼 Description 테이블에 대한 참조를 생각해보십시오.

설명에 대한 참조 중 하나 이상에 별칭을 지정해야합니다. 따라서 별표를 구분할 수 있습니다. (그렇지 않으면, MySQL은 우리가 우리가 Description.description 말했다 경우에 대해 얘기하고 어느 알 수 없습니다.) 외래 키 열 objDescID 또는 objLocID이 NULL 값을 갖는 경우, 또는 일치하는 값이 존재하지 않는

주 참조 된 테이블에서 쿼리는 Object에서 행을 반환하지 않습니다.

일치하는 값을 찾을 수없는 경우에도 개체에서 행을 가져 오려면 키워드를 포함하여 OUTER 조인 작업을 사용할 수 있습니다.

예를 들어

: 하나의 별명이 실제로 필요

SELECT o.objID  AS `ID` 
    , d.description AS `Description` 
    , l.description AS `Location` 
FROM Object o 
LEFT 
JOIN Description d 
    ON d.descID = o.objDescID 
LEFT 
JOIN Description l 
    ON l.descID = o.objLocID 

참고,하지만 난 쿼리의 모든 행 소스에 짧은 별칭을 할당하는 경향이있다. 이것은 문장을 더 잘 해석 할 수있게 해 주며, 이미 사용 된 테이블에 또 다른 참조를 추가해야하거나, 테이블 이름 중 하나를 다른 테이블 이름이나 인라인 뷰 (또는 하위 쿼리)로 바꿔야 할 경우 정말로 도움이됩니다. 별칭을 그대로두고 행 소스 만 변경할 수 있습니다. 다른 별칭은 명령문의 실제 실행에 어떤 차이도 만들지 않습니다. 더 복잡한 쿼리에 대해 수행하는 간단한 쿼리에 대해 동일한 패턴을 따르기 때문에 바로 별개입니다.

+0

+1, 내 자신보다 약간 더 자세한 설명 –

관련 문제