我有一个返回多行的连接。我需要修改代码,所以它不会这样做。我发现了一种效率极低的方法,希望有人能指出我正确的方向。
我的数据集包含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
我想要一种更有效的方法来做到这一点,但我无法弄清楚如何做到这一点。任何想法都非常感谢。
答案 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