复杂的SQL自连接
我有一个存储员工信息的表(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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
不确定,但我认为这就是你想要的;只需多次对表进行自连接:
此外,您可能希望更改数据类型以匹配(对数字数据使用数字类型等)。如果您可以发布示例脚本而不是描述,那就太好了:)
Not sure, but I think this is what you want; just do a self join to the table multiple times:
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 :)