首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复杂SQL自连接

复杂SQL自连接
EN

Stack Overflow用户
提问于 2011-10-24 19:03:12
回答 1查看 179关注 0票数 1

我有一个存储员工信息的表(EmpInfo)。以下是字段:

EMPLID - varchar(11) (PK)

名称- varchar(50)

POSITION_NBR - varchar(8)

CREPORTS5 - char(8)

CREPORTS6 - char(8)

CREPORTS7 - char(8)

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

我正在尝试编写一个SQL查询,在这里我可以返回CREPORTS的名称,而不是POSITION_NBR

等级结构:

杰克琼斯-首席执行官

副校长约翰史密斯-经理

.Sarah=‘Sarah 2’>/.Sarah=‘Sarah 2’>.Sarah=‘Sarah 2’>.

(B)工业,工业,工业

.=‘2’>

代码语言:javascript
复制
-------------------------------------------------------------------------------- 
|  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,所以我的第一次尝试是这样的:

代码语言:javascript
复制
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

此查询工作正常,但在对300 k记录运行时很慢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-24 19:17:01

不确定,但我认为这是您想要的;只需多次对表进行自我连接:

代码语言:javascript
复制
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

此外,您可能希望更改数据类型以匹配(对数字数据使用数字类型等)。如果您能够发布一个示例脚本,而不是一个描述,那就更好了:)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7880513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档