加入多个父/子记录

时间:2010-08-24 06:57:54

标签: sql-server-2005 tsql join

我正在对Cisco ICM数据库进行一些分析,专门研究转移的呼叫。

基本上有一个ICRCallKey字段,它是在外围网关为表中记录的每一行生成的唯一编号。通过查看ICRCallKeyParent和ICRCallKeyChild字段并查看它们是否包含ICRCallKey字段中的值,我可以判断何时传输了呼叫。

如果调用被多次转移,因为每个字段中都有一个预期的值。

例如,如果呼叫已被转移五次,我希望从数据库中看到每条线路,这样我就可以看到呼叫所采用的路由。这称为从摇篮到坟墓(由于某种未知原因!),可以通过不同的外围设备和用户以及整个呼叫在系统中的总时间等来跟踪呼叫。可能性是无止境! ; - )

我错过了一种非常简单的方法吗?

SELECT p.AgentSkillTargetID [p_AgentSkillTargetID]
,   p.CallDisposition [p_CallDisposition]
,   p.DateTime [p_DateTime]
,   p.Duration [p.Duration]
,   p.ICRCallKey [p.ICRCallKey]
,   p.ICRCallKeyParent [p_ICRCallKeyParent]
,   p.ICRCallKeyChild [p.ICRCallKeyChild]
,   p.CallTypeID [p_CallTypeID]
,   c.AgentSkillTargetID [c_AgentSkillTargetID]
,   c.CallDisposition [c_CallDisposition]
,   c.DateTime [c_DateTime]
,   c.Duration [c_Duration]
,   c.ICRCallKey [c_ICRCallKey]
,   c.ICRCallKeyParent [c_ICRCallKeyParent]
,   c.ICRCallKeyChild [c_ICRCallKeyChild]
,   c.CallTypeID [c_CallTypeID]
FROM tblTCD [p]
LEFT JOIN tblTCD [c]
ON p.ICRCallKeyChild = c.ICRCallKey
AND p.RouterCallKeyDay = c.RouterCallKeyDay

这是我正在使用的SQL,输出示例如下。

p_AgentSkillTargetID p_CallDisposition p_DateTime              p.Duration  p.ICRCallKey p_ICRCallKeyParent p.ICRCallKeyChild p_CallTypeID c_AgentSkillTargetID c_CallDisposition c_DateTime              c_Duration  c_ICRCallKey c_ICRCallKeyParent c_ICRCallKeyChild c_CallTypeID
-------------------- ----------------- ----------------------- ----------- ------------ ------------------ ----------------- ------------ -------------------- ----------------- ----------------------- ----------- ------------ ------------------ ----------------- ------------
90277                29                2010-08-16 08:26:58.113 78          1879479165   NULL               1879479175        7669         94669                30                2010-08-16 02:54:04.077 499         1879479175   NULL               1879479179        15029
90045                28                2010-08-16 08:58:27.623 98          1879479460   NULL               1879479480        7890         104415               28                2010-08-16 08:42:27.067 43          1879479480   NULL               1879479481        15029
89971                29                2010-08-16 09:10:53.110 586         1879479523   NULL               1879479628        7663         97518                29                2010-08-16 09:19:04.583 109         1879479628   NULL               1879479650        23893
74814                28                2010-08-16 09:05:08.577 115         1879479174   NULL               1879479238        19256        92707                7                 2010-08-16 08:33:50.103 2           1879479238   NULL               NULL              7663
80435                28                2010-08-16 09:04:52.577 103         1879479171   NULL               1879479194        19263        94669                30                2010-08-16 04:14:33.077 121         1879479194   NULL               1879479198        15029
88952                29                2010-08-16 09:05:24.033 83          537702168    NULL               537702175         26543        54070                28                2010-08-16 09:43:32.597 784         537702175    NULL               537702344         16016
74783                28                2010-08-16 09:14:11.080 363         1879479324   NULL               1879479379        19856        102341               29                2010-08-16 09:19:27.600 1859        1879479379   NULL               1879479809        7669
89161                29                2010-08-16 09:10:45.540 151         537702198    NULL               537702212         16094        103369               29                2010-08-16 09:40:35.593 412         537702212    NULL               537702257         25507
74708                29                2010-08-16 09:20:09.083 707         1879479331   NULL               1879479487        10216        99954                7                 2010-08-16 08:58:50.623 2           1879479487   NULL               NULL              7663
100868               29                2010-08-16 09:10:43.540 113         537702204    NULL               537702219         26543        70678                29                2010-08-16 09:36:46.590 55          537702219    NULL               537702226         20067

正如您所见,我在p.ICRCallKeyChild = c.ICRCallKey上有一个基本的联接。如果再次转移呼叫,则c_ICRCallKeyChild中会有一个号码,然后以与第一次加入相同的方式加入tblTCD

我希望看到的是以下(制作)结果:

CallReference CallTransferCounter AgentSkillTargetID CallDisposition DateTime                Duration CallTypeID
------------- ------------------- ------------------ --------------- ----------------------- -------- ----------
1             1                   90277              29              2010-08-06 08:26:58.113 78       7699
1             2                   90045              30              2010-08-06 08:28:56.445 345      5467
1             3                   7786               13              2010-08-06 08:34:34.243 445      4355
2             1                   78973              13              2010-08-06 09:14:34.423 43       3342

这更有意义吗?我希望CallReference在每次新调用时都会递增,但CallTransferCounter会随着每个调用的IE调用而增加,这就是父/子关系。

1 个答案:

答案 0 :(得分:0)

您需要查看Common Table Expressions,尤其是Recursive选项。

来自第二个链接的伪代码:

WITH cte_name ( column_name [,...n] )
AS
( 
CTE_query_definition –- Anchor member is defined.
UNION ALL
CTE_query_definition –- Recursive member is defined referencing cte_name.
)
-- Statement using the CTE
SELECT *
FROM cte_name

如果您能回答我在问题中添加的问题,我可能会发布一些更贴近您实际需要的代码。目前,我不确定如何构建锚点查询,因为不清楚如何识别(超)父行。我希望它是没有ICRCallKeyParent值的行,但是你的示例输出不支持这个概念。

相关问题