SQL - 运行查询

时间:2016-02-04 12:57:53

标签: sql sql-server join

我正在尝试构建一个报告,显示其标题下的人员名称,即列。

我是SQL的新手所以我创建了以下查询,数据跨越2个表,因此有一个连接,ID列包含人员ID号,所以我需要报告将ID与人匹配然后将其显示为他们的名字。

每个作业都有合同代码,因此我想显示合同代码,然后显示与合同代码相关联的人员。

Select distinct isnull(h.ContractCode, '0000') as "Contract Code", 
(Select distinct K.name 
from WF_HSReport
where h.SiteManager=k.id) as "Site Manager",
(Select distinct K.name 
from WF_HSReport
where h.ContractManager=k.ID) as "Contract Manager",
(Select distinct K.name 
WF_HSReport
where h.SHEQAdvisor=k.ID) as "SHEQ Advisor",
(Select distinct K.name 
from WF_HSReport
where h.HSDirector=k.ID) as "HS Director",
(Select distinct K.name 
from WF_HSReport
where h.SHEQManager=k.id) as "SHEQ Manager",
(Select distinct K.name 
from WF_HSReport
where h.ContractsDirector=k.id) as "ContractsDirector"
FROM WF_HSReport h
JOIN KUAF k
ON h.SiteManager=k.ID 
or h.ContractManager=k.ID 
or h.SHEQAdvisor=k.ID 
or h.HSDirector=k.ID
or h.SHEQManager=k.ID
or h.ContractsDirector=k.ID
where h.VersionNum = -1

所以我知道这可能不是编写查询的最佳方式,但它给了我一个结果。比如:

Data Output

正如您所看到的,每个作业有多行,有些作业会改变签名作业的人,这对于人来说并不重要,因为最后一行确定当前版本所以应该取消年长的名字。

我需要做的是每个合同代码有一行显示当前与该工作相关的人员?

干杯。

PS,我的大脑有点油炸,所以如果我把东西丢掉了就道歉了。

更新

Jeremy的第一个建议是,但结果仍然显示多个合同代码,因此我的Where子句似乎没有实现。

Multiple ContractCode Results

我确定这是我要么忽略的东西,要么是我还不知道的东西。

1 个答案:

答案 0 :(得分:0)

有多种方法可以解决此问题。

一种方法是删除您的连接语句并仅使用子选择查询,但您需要重新构建子选择查询以从KUAF而不是WF_HSReport中进行选择。

Select distinct isnull(h.ContractCode, '0000') [Contract Code]

,(SELECT TOP 1 k.name FROM KUAF k WHERE k.ID = h.SiteManager) [Site Manager]
,(SELECT TOP 1 k.name FROM KUAF k WHERE k.ID = h.ContractManager) [Contract Manager]
,(SELECT TOP 1 k.name FROM KUAF k WHERE k.ID = h.SHEQAdvisor) [SHEQ Advisor]
,(SELECT TOP 1 k.name FROM KUAF k WHERE k.ID = h.HSDirector) [HS Director]
,(SELECT TOP 1 k.name FROM KUAF k WHERE k.ID = h.SHEQManager) [SHEQ Manager]
,(SELECT TOP 1 k.name FROM KUAF k WHERE k.ID = h.ContractsDirector) [ContractsDirector]

FROM WF_HSReport h
where h.VersionNum = -1

另一种方法是在KUAF表上为每个人员类型执行左外连接并使用别名。

SELECT DISTINCT ISNULL(h.ContractCode,'0000') [Contract Code]
,sm.name [Site Manager]
,cm.name [Contract Manager]
,sa.name [SHEQ Advisor]
,hd.name [HS Director]
,sm.name [SHEQ Manager]
,cd.name [Contract Director]
FROM WF_HSReports h
LEFT OUTER JOIN KUAF sm ON h.SiteManager = sm.ID
LEFT OUTER JOIN KUAF cm ON h.ContractManager = cm.ID
LEFT OUTER JOIN KUAF sa ON h.SHEQAdvisor = sa.ID
LEFT OUTER JOIN KUAF hd ON h.HSDirector = hd.ID
LEFT OUTER JOIN KUAF sm ON h.SHEQManager = sm.ID
LEFT OUTER JOIN KUAF cd ON h.ContractDirector = cd.ID
WHERE h.VersionNum = -1

这假设ID实际上是唯一的密钥。如果它不是唯一的,那么一定要添加你需要的任何限定符,以确保你只返回正确的人员类型。即

#.ID = h.SHEQManager AND #.Type = 'Manager'

添加到WHERE子句:

WHERE h.VersionNum = -1 AND h.ContractCode IS NOT NULL