2011-10-24 73 views
1

我有一個表(EmpInfo)存儲員工信息。下面是字段:複雜的SQL自我加入

EMPLID - VARCHAR(11)(PK)
NAME - VARCHAR(50)
POSITION_NBR - VARCHAR(8)
CREPORTS5 - 炭(8)
CREPORTS6 - 炭(8)
CREPORTS7 - 炭(8)

CREPORTS字段引用命令鏈中的POSITION_NBR字段。

我想寫一個SQL查詢,我可以返回CREPORTS代替POSITION_NBR

層次結構的名稱:

傑克·瓊斯 - CEO
   約翰·史密斯 - 經理
           薩拉測試 - 主管
                 蘇茜Blerg - 工人
                 邁克·馬丁 - 工人

-------------------------------------------------------------------------------- 
| EMPLID |  NAME  | POSITION_NBR | CREPORTS5 | CREPORTS6 | CREPORTS7 | 
-------------------------------------------------------------------------------- 
| 1234 | John Smith | 11111  | 22222 | NULL | NULL | 
-------------------------------------------------------------------------------- 
| 2345 | Jack Jones | 22222  | NULL | NULL | NULL | 
-------------------------------------------------------------------------------- 
| 3456 | Sarah Test | 33333  | 22222 | 11111 | NULL | 
-------------------------------------------------------------------------------- 
| 4567 | Suzy Blerg | 44444  | 22222 | 11111 | 33333 | 
-------------------------------------------------------------------------------- 
| 5678 | Mike Martin | 55555  | 22222 | 11111 | 33333 | 
-------------------------------------------------------------------------------- 

我沒有太大的SQL的傢伙,所以我的第一個嘗試像這樣:

SELECT  EmpInfo.EMPLID  
       EmpInfo.CREPORTS5, 
        CAST 
        ((SELECT  TOP (1) NAME 
         FROM   EmpInfo AS subInfo 
         WHERE  (subInfo.POSITION_NBR = EmpInfo.CREPORTS5)) AS varchar(50)) AS CREPORTS5_NAME 
FROM EmpInfo 

該查詢有效,但在對300k條記錄運行時運行緩慢。

回答

3

不確定,但我認爲這是你想要的;只是做一個自聯接表中多次:

DECLARE @t TABLE 
    (
     EMPLID VARCHAR(11) 
    , NAME VARCHAR(50) 
    , POSITION_NBR VARCHAR(8) 
    , CREPORTS5 CHAR(8) 
    , CREPORTS6 CHAR(8) 
    , CREPORTS7 CHAR(8) 
    ) 


INSERT INTO @t 
     (EMPLID, NAME, POSITION_NBR, CREPORTS5, CREPORTS6, CREPORTS7) 
VALUES ('1234', 'John Smith', '11111', '22222', NULL, NULL), 
     ('2345', 'Jack Jones', '22222', NULL, NULL, NULL), 
     ('3456', 'Sarah Test', '33333', '22222', '11111', NULL) , 
     ('4567', 'Suzy Blerg', '44444', '22222', '11111', '33333'), 
     ('5678', 'Mike Martin', '55555', '22222', '11111', '33333') 


SELECT t.EMPLID 
     , t.Name 
     , t2.NAME AS CDR5Name 
     , t3.NAME AS CDR6Name 
     , t4.NAME AS CDR7Name 
FROM @t t 
     LEFT JOIN @t t2 ON t.CREPORTS5 = t2.POSITION_NBR 
     LEFT JOIN @t t3 ON t.CREPORTS6 = t3.POSITION_NBR 
     LEFT JOIN @t t4 ON t.CREPORTS7 = t4.POSITION_NBR 

此外,您可能要更改數據類型匹配(使用數字類型的數值數據等)。這也將是很好,如果你可以發佈一個示例腳本,而不是描述:)