我有一个我没有设计的SQL Server数据库。 员工拥有存储在几个不同表中的学位,执照和证书。 我已经编写了查询以将所有这些信息连接在一起,因此我可以看到数据外观的全部结果。我被要求为这些数据创建一个视图,该视图仅返回他们获得的最高学位和两个最高认证。 问题是,由于它是预先存在的数据,因此数据中没有内置层次结构。所有学位和证书都只是存储为与其员工编号相关联的字符串。 第一个逻辑步骤是创建一个邻接列表(我相信这是正确的术语)。 例如,'MD'是您可以在我们的列表中获得的最高学位。所以我给出了“排名”1.下一个较低的学位是“排名”为2.依此类推。 我可以加入包含这些内容的文本字段并返回其相关的排名。 我遇到的问题是根据这个排名只返回两个最高的。 如果员工拥有多个学位或证书,则会列在第二行或第三行。从逻辑的角度来看,我需要对员工ID,名字和姓氏进行分组。然后是一些如何根据我为他们创建的“排名”来连接学位,证书和许可证。它不是我思考它的方式的真正等级,因为我只需要知道最高的两个,而不一定是结果之间的关系。
另一个可能的警告是数据库必须保持SQL Server 2000兼容模式。
我们非常感谢您提供的任何帮助。谢谢。
select a.EduRank as 'Licensure Rank',
b.EduRank as 'Degree Rank',
EmpComp.EecEmpNo,
EmpPers.EepNameFirst,
EmpPers.EepNameLast,
RTRIM(EmpEduc.EfeLevel),
RTRIM(EmpLicns.ElcLicenseID),
a.EduType,
b.EduType
from empcomp
join EmpPers on empcomp.eeceeid = EmpPers.eepEEID
join EmpEduc on empcomp.Eeceeid = EmpEduc.EfeEEID
join EmpLicns on empcomp.eeceeid = EmpLicns.ElcEEID
join yvDegreeRanks a on a.EduCode = EmpLicns.ElcLicenseID
join yvDegreeRanks b on b.EduCode = EmpEduc.EfeLevel
答案 0 :(得分:1)
我想我能看出你的问题是什么 - 但我不确定。将表连接在一起给了你“双排”。解决此查询的“快速而又脏”的方法是使用除连接之外的子查询。这样,您只能选择TOP 1
学位和TOP 2
认证。
编辑:您可以尝试此查询吗?
SELECT *
FROM employSELECT tblLicensures.EduRank as 'Licensure Rank',
tblDegrees.EduRank as 'Degree Rank',
EmpComp.EecEmpNo,
EmpPers.EepNameFirst,
EmpPers.EepNameLast,
RTRIM(tblDegrees.EfeLevel),
RTRIM(tblLicensures.ElcLicenseID),
tblLicensures.EduType,
tblDegrees.EduType
FROM EmpComp
LEFT OUTER JOIN EmpPers ON empcom.eeceeid = EmpPers.eepEEID
LEFT OUTER JOIN
-- Select TOP 2 Licensure Ranks
(
SELECT TOP 2 a.EduType, a.EduRank, EmpLicns.ElcEEID
FROM yvDegreeRanks a
INNER JOIN EmpLicns on a.EduCode = EmpLicns.ElcLicenseID
WHERE EmpLincs.ElcEEID = empcomp.eeceeid
ORDER BY a.EduRank ASC
) AS tblLicensures ON tblLicensures.ElcEEID = empcomp.Eeceeid
LEFT OUTER JOIN
-- SELECT TOP 1 Degree
(
SELECT TOP 1 b.EduType, b.EduRank, EmpEduc.EfeEEID, EmpEduc.EfeLevel
FROM yvDegreeRanks b
INNER JOIN EmpEduc on b.EduCode = EmpEduc.EfeLevel
WHERE EmpEduc.EfeEEID = empcomp.Eeceeid
ORDER BY b.EduRank ASC
) AS tblDegrees ON tblDegrees.EfeEEID = empcomp.Eeceeid
答案 1 :(得分:0)
这不是最优雅的解决方案,但希望它至少会以某种方式帮助你。
create table #dataset (
licensurerank [datatype],
degreerank [datatype],
employeeid [datatype],
firstname varchar,
lastname varchar,
efeLevel [datatype],
elclicenseid [datatype],
edutype1 [datatype],
edutype2 [datatype]
)
select distinct identity(int,1,1) [ID], EecEmpNo into #employeeList from EmpComp
declare
@count int,
@rows int,
@employeeNo int
select * from #employeeList
set @rows = @@rowcount
set @count = 1
while @count <= @ROWS
begin
select @employeeNo = EecEmpNo from #employeeList where id = @count
insert into #dataset
select top 2 a.EduRank as 'Licensure Rank',
b.EduRank as 'Degree Rank',
EmpComp.EecEmpNo,
EmpPers.EepNameFirst,
EmpPers.EepNameLast,
RTRIM(EmpEduc.EfeLevel),
RTRIM(EmpLicns.ElcLicenseID),
a.EduType,
b.EduType
from empcomp
join EmpPers on empcomp.eeceeid = EmpPers.eepEEID
join EmpEduc on empcomp.Eeceeid = EmpEduc.EfeEEID
join EmpLicns on empcomp.eeceeid = EmpLicns.ElcEEID
join yvDegreeRanks a on a.EduCode = EmpLicns.ElcLicenseID
join yvDegreeRanks b on b.EduCode = EmpEduc.EfeLevel
where EmpComp.EecEmpNo = @employeeNo
set @count = @count + 1
end
答案 2 :(得分:0)
拥有员工表,学位类型(包括排名),证书类型(包括排名),以及联接表employees_degrees和employees_certs。 [将度和证书放在一个带有标志is_degree的表中可能会更好,如果所有其他字段都相同。]您可以提取现有的字符串值并将其替换为FK ID学位和证书表。
查询本身更难,因为PARTITION BY
在SQL Server 2000中不可用(根据Google)。威斯康星大学的答案至少有两个问题:你需要LEFT JOIN
因为并非所有员工都拥有学位和证书,并且没有ORDER BY
来展示你想要的最佳 >。在这种情况下,TOP 2
子查询特别难以使用。因此,我还不能给出答案。