SQL加入多个OR条件会返回重复项

问题描述:

我有一个返回多行的连接。我需要修改代码,所以它不这样做。我已经想出了一种效率极低的方法,并希望有人能指引我走向正确的方向。SQL加入多个OR条件会返回重复项

我的数据集由一个AGENT CTE中的50位代理人组成,他们将技术支持票存储在TICKETS表中。代理信息存储在员工表中。我需要加入这三个对象,以便每张票都与其代理相关联。在特定的支持呼叫代理所有权可以由一个或多个字段

-initial ticket responder 
-ticket creator 
-ticket owner 

的复杂之处在于我的50个代理的1个或多个可以在这三个领域中的任何一个出现来确定。使用此语法执行连接会导致重复。

with CTE_Agents as 
(agent_name, agent_region) --defines in-scope agents and agent region for this project 

select 
fi.servicerequestnumber as In_Scope_Ticket 
join vwdimemployee E1 (NOLOCK) on 

E1.EmployeeDerivedID = fi.InitialResponseOwnerEmployeeDerivedID 
or E1.employeederivedID = fi.creatoremployeederivedid 
or e1.employeederivedid = fi.CurrentOwnerEmployeeDerivedID 
join cte_agents ag on e1.EmployeeEmail = ag.agent 

由于多个范围内代理可以在多个连接字段中,因此上面的查询将返回重复项。例如,如果代理1同时是票据创建者和票证所有者,那么当我只需要一个时,我会得到2个结果。如果代理3是票证所有者,代理4是票据创建者,我也会在结果集中两次获取该特定票据。

在这种重复的情况下,我想返回一行。我目前的解决方案是:

select 
e1.employeename as InitalOwner 
,e2.employeename as ticketcreator 
,e3.employeename as ticketowner 

join vwdimemployee E1 (NOLOCK) on E1.EmployeeDerivedID = st.InitialResponseOwnerEmployeeDerivedID 
join vwdimemployee e2 (NOLOCK) on e2.employeederivedID = st.creatoremployeederivedid 
join vwdimemployee e3 (NOLOCK) on e3.employeederivedID = st.CurrentOwnerEmployeeDerivedID 

在多个结果的情况下,我使用这一点的代码给予当前所有者优先权。 (结果是通过多个CTE来完成的)。

isnull(initial_task_agent,isnull(creator_task_agent,current_task_agent)) as CCE_Agent 
,isnull(initial_region,isnull(Creator_Region,Current_Region)) as CCE_Region 

我想要一个更有效的方法来做到这一点,但我不知道如何。任何想法都非常感谢。

你会发现,COALESCE()比ISNULL效果更好()位置:

coalesce(initial_task_agent,creator_task_agent,current_task_agent) as CCE_Agent 
,coalesce(initial_region,Creator_Region,Current_Region) as CCE_Region 

COALESCE()就像ISNULL,但你可以列出不止2个参数。除此之外,这不是一个坏方法。

如果你使用的是MSSQL,你可能会让一个函数(或存储过程)更快地进行查询,因为它是预编译的。

类似: CREATE FUNCTION [dbo].[func_get_emp] ( @empID as int ) RETURNS varchar BEGIN Declare @cRtn as varchar(100) select @cRtn =employeename from vwdimemployee where employeederivedID = @empID Return(@cRtn) END 您可以使用查询 select dbo.func_get_emp(InitialResponseOwnerEmployeeDerivedID) as InitalOwner ,dbo.func_get_emp(creatoremployeederivedid) as ticketcreator ,dbo.func_get_emp(CurrentOwnerEmployeeDerivedID) as ticketowner