复杂的SQL自连接

发布于 2024-12-11 19:14:45 字数 2172 浏览 2 评论 0原文

我有一个存储员工信息的表(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

层次结构:

Jack Jones - CEO
约翰·史密斯 - 经理
      莎拉测试 - 主管
        Suzy Blerg - 工人
        Mike Martin - Worker

-------------------------------------------------------------------------------- 
|  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 条记录运行时。

I have a table (EmpInfo) where employee info stored. Here are the fields:

EMPLID - varchar(11) (PK)
NAME - varchar(50)
POSITION_NBR - varchar(8)
CREPORTS5 - char(8)
CREPORTS6 - char(8)
CREPORTS7 - char(8)

The CREPORTS field references the POSITION_NBR field in a chain of command.

I'm trying to write a SQL query where I can return the name of CREPORTS instead of the POSITION_NBR

Hierarchy Structure:

Jack Jones - CEO
  John Smith - Manager
      Sarah Test - Supervisor
         Suzy Blerg - Worker
         Mike Martin - Worker

-------------------------------------------------------------------------------- 
|  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   |
--------------------------------------------------------------------------------

I'm not much of a SQL guy, so my first attempt went like this:

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

This query works, but is slow when running it against 300k records.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

沐歌 2024-12-18 19:14:45

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

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

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

Not sure, but I think this is what you want; just do a self join to the table multiple times:

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

Also, you may want to change the datatypes to match (use a numeric type for numerical data, etc). It would also be nice if you could post a sample script instead of a description :)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文