SQL은

2016-10-05 6 views
0
내 DB에서이 개 테이블을 데

SQL은

1) 보고서 테이블

AppNo AppName AddedBy AssignedTo ModifiedBy 
------------------------------------------- 
    1 App1  1  2   1  
    2 App2  1  2   2 
    3 App3  2  2   2 
    4 App4  1  2   3 

2) 사용자 테이블이

UserId UserName Role 
    ---------------------- 
    1  Raj  Manager 
    2  Sid  Lead 
    3  KK  Rep 

그래서 내가이 가입 할 여러 컬럼에 대해 하나의 테이블에 가입 테이블 대신 내가 이드의 이름을 얻을 수 있도록

결과가 필요 :

AppNo AppName AddedBy AssignedTo ModifiedBy 
    ------------------------------------------- 
    1 App1  Raj  Sid   Raj  
    2 App2  Raj  Sid   Sid 
    3 App3  Sid  Sid   Sid 
    4 App4  Raj  Sid   KK 
내 쿼리 :

SELECT 
R.AppNo, R.AppName, 
u1.UserName as AddedBy, 
u2.UserName as AssignedTo, 
u3.UserName as ModifiedBy 

FROM Report R 

LEFT OUTER JOIN Users u1 on u1.UserID = R.AddedBy 
LEFT OUTER JOIN Users u2 on u2.UserID = R.AssignedTo 
LEFT OUTER JOIN Users u3 on u3.UserID = R.ModifiedBy 

하지만 사용자 테이블에 여러 시간을 가입하려는 해달라고 .. 거의 8 사용자 아이디 열이되어 있습니다 내 원래 보고서 표에서와 같이

거기에 그래서 나는 성능을 감소 8 번 가입 할 수 없습니다.

누구나 최선의 방법을 제안 할 수 있습니까?

참고 : 내가 미리 테이블 스키마를

감사를 변경하지 못할 수있는 유일한 방법을 여러 번 가입하는

답변

1

; 이것이 바로 데이터와 구조입니다.

데이터베이스는 일반적으로이 문제를 처리 할 수 ​​있도록 설계되었으므로 성능 문제가 없어야합니다. JOIN이 사람에게 복잡해 보이기 만해도 옵티 마이저 또는 데이터베이스에 대해 복잡하거나 비용이 많이 드는 것은 아닙니다.

성능은 테이블이 얼마나 잘 색인에 크게 좌우 될 것이다하지만 당신은, 데카르트가 열에 대해 조인을 사용 할 수
0

...

select R.AppNo, 
     R.AppName, 
     (select UserName from Users where UserID = R.AddedBy) as AddedBy, 
     (select UserName from Users where UserID = R.AssignedTo) as AssignedTo, 
     (select UserName from Users where UserID = R.ModifiedBy) as ModifiedBy 
from Report R