2011-09-01 2 views
1
나는 다음과 같은 SQL 호출을 만들고있어

의 테이블을 여러 번 사용 dpt_parent는 상위 부서 ID (다른 부서의 dpt_id)의 정수 값입니다는 SELECT 문

SELECT dpt_id, 
dpt_title, 
dpt_active, 
dpt_parent 
FROM tbl_department ORDER BY dpt_title 

.

위의 호출 결과에서 dpt_parent의 dpt_title을 포함하고 싶습니다. 이 형태의 호출

SELECT dpt_id, 
dpt_title, 
dpt_active, 
dpt_parent, 
    (SELECT dpt_title 
    FROM tbl_department 
    WHERE tbl_department.dpt_id = dpt_parent 
    ) AS parent_title 
FROM tbl_department ORDER BY dpt_title 

을 나는이 문제에 대한 해결책은 무엇인가, 이런 같은 테이블이 혼란하여 볼 수 있습니다 PARENT_TITLE의 모든 값은 NULL이며, 다음과 같이이 나의 최초의 시도였다?

답변

3

테이블 별칭 사용

SELECT dpt_id, 
x.dpt_title, 
x.dpt_active, 
x.dpt_parent, 
    (SELECT dpt_title 
    FROM tbl_department 
    WHERE tbl_department.dpt_id = x.dpt_parent 
    ) AS parent_title 
FROM tbl_department x ORDER BY dpt_title 

을하지만 당신은 선택 하위를 제거하고처럼 결합 더 나을 것 :

SELECT 
    a.dpt_id 
    ,a.dpt_title 
    ,a.dpt_active 
    ,a.dpt_parent 
    ,b.dpt_title parent_title 
FROM tbl_department  a 
LEFT JOIN tbl_department b ON a.dpt_parent = b.dpt_id 
ORDER BY a.dpt_title, b.dpt_title 
+2

중첩 된 쿼리는 성능에 위험하므로 쿼리 분석기는 항상 JOIN을 수행 할 수 있는지 "확인"하지 않습니다. 명시적인 JOIN이 더 좋습니다. – Lucero

+0

@Lucero, OP의 경우 첫 번째 코드 예제가 작동하지만 변경되었으므로 두 번째 예제는 어떻게 작성해야하는지입니다. –

+0

@KM, 나는 동의하지만 실제로 두 번째 예제를 추가하기 전에 주석을 달았습니다. 모두 좋은 지금은;) – Lucero

2
SELECT d.dpt_id, 
d.dpt_title, 
d.dpt_active, 
d.dpt_parent, 
p.dpt_title AS parent_title 
FROM tbl_department d 
LEFT JOIN tbl_department p 
    ON p.dpt_parent = d.dpt_id 
ORDER BY d.dpt_title 
+2

열 이름이 모호, 당신이 그들 모두에 별칭을 사용해야합니다. – Lucero

+0

@Lucero, 고마워, 네가 맞아. 나는 그들을 잊었다. 검색어가 업데이트되었습니다. – EricZ

+0

그 이유는 처음에 10 초 정도 나를 이겼다 ...;) – Lucero

3
SELECT d.dpt_id, 
d.dpt_title, 
d.dpt_active, 
d.dpt_parent, 
p.dpt_title parent_title 
FROM tbl_department d 
LEFT JOIN tbl_department p ON d.dpt_parent = p.dpt_id 
ORDER BY d.dpt_title 
+0

+1은 유용하며 문제를 해결합니다! – fearoffours

0

나는 솔루션은이 같은 테이블에 가입하거나 부서 ID를 취하는 사용자 정의 함수를 만들고 부모 부서 이름을 반환 할 수 있도록하는 것입니다 생각합니다.

1

그것은이 쿼리로 다시 작성해야 나에게 보인다 :

SELECT dpt_id, 
dpt_title, 
dpt_active, 
dpt_parent, 
    (SELECT dpt_title 
    FROM tbl_department AS [dept2] 
    WHERE [dept2].dpt_id = [dept1].dpt_parent 
    ) AS parent_title 
FROM tbl_department AS [dept1] ORDER BY dpt_title 

그렇지 않으면 SQL Server는 사용자가 말하는 테이블의 인스턴스를 알 수 없습니다.

+0

+1 친숙하고 읽기 쉽기 때문에이 솔루션을 좋아합니다. – fearoffours

+0

@fear 영광입니다. – Johan

1

난 당신이 그런 식으로 뭔가를 찾고 있다고 생각 : 선택의

SELECT a.dpt_id, 
a.dpt_title, 
a.dpt_active, 
a.dpt_parent, 
b.dpt_title AS parent_title 
FROM tbl_department AS a 
INNER JOIN tbl_department AS b ON b.dpt_id = a.dpt_parent 
ORDER BY dpt_title