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