SQL连接多个OR条件返回重复项

时间:2015-07-09 20:24:19

标签: sql join

我有一个返回多行的连接。我需要修改代码,所以它不会这样做。我发现了一种效率极低的方法,希望有人能指出我正确的方向。

我的数据集包含AGENT CTE中50个代理商的列表,这些代理商获取存储在TICKETS表中的技术支持票证。代理信息存储在员工表中。我需要加入这三个对象,以便每张票都与它的代理相关联。特定支持呼叫的代理所有权可以由一个或多个字段确定

-initial ticket responder
-ticket creator
-ticket owner

复杂的是,我的50个代理中的一个或多个可以出现在这三个字段中的任何一个中。使用此语法执行连接会导致重复。

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

我想要一种更有效的方法来做到这一点,但我无法弄清楚如何做到这一点。任何想法都非常感谢。

2 个答案:

答案 0 :(得分:1)

你会发现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个以上的参数。除此之外,这不是一个糟糕的方法。

答案 1 :(得分:0)

如果您正在使用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