2011-10-24 13 views
1

私は従業員情報が格納されているテーブル(EmpInfo)を持っています。ここでは、次のフィールドがあります複合SQL自己結合

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

CREPORTSフィールドは、コマンドチェーン内のPOSITION_NBRフィールドを参照します。 - CEO
   ジョン・スミス - Managerの

ジャック・ジョーンズ:私はCREPORTSの名前の代わりに、POSITION_NBR

階層構造を返すことができるSQLクエリを記述しようとしている


           サラテスト - スーパーバイザー
                 スージー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 

また、あなたは(など、数値データの数値型を使用)と一致するデータ型を変更することもできます。また、説明の代わりにサンプルスクリプトを投稿するといいでしょう:)