使用FULL OUTER JOIN时缺少某些行

时间:2019-07-18 16:04:36

标签: sql-server full-outer-join

我正在尝试使用FULL OUTER JOIN联接两个表,但是由于缺少一行,所以我没有达到我的期望。

我正试图将两个表连接到3个不同的列中。

表A:

CallId      ASId    DateTime    CallStatus     DurationSeconds
21280070    NULL    17/07/2019  in_queue        1
21280070    2099726 17/07/2019  agent_dialing   3
21280070    2099726 17/07/2019  agent_ringing   3
21280070    2099726 17/07/2019  speaking_agent  95
21280070    NULL    17/07/2019  in_queue        1
21280070    2098692 17/07/2019  agent_dialing   1
21280070    2098692 17/07/2019  agent_ringing   6
21280070    2098692 17/07/2019  speaking_agent  10

表B:

B.ASId  B.CallId    B.CallDetails                   B.DateTime  B.Duration
2099726 21280070    dialing                         17:21:41    3
2099726 21280070    ringing                         17:21:44    3
2099726 21280070    incoming_call_in_conversation   17:23:19    95
2098692 21280070    dialing                         17:23:21    1
2098692 21280070    ringing                         17:23:27    6
2098692 21280070    incoming_call_in_conversation   17:23:37    10
2098692 21280070    wrapup                          17:23:57    20

我想得到这样的东西:

A.CallId    A.ASId  A.DateTime  A.CallStatus    A.DurationSeconds       B.ASId  B.CallId    B.CallDetails   B.DateTime  B.Duration
21280070    NULL    17:21:38    in_queue        1                       NULL    NULL        NULL            NULL    NULL
21280070    2099726 17:21:41    agent_dialing   3                       2099726 21280070    dialing         17:21:41    3
21280070    2099726 17:21:44    agent_ringing   3                       2099726 21280070    ringing         17:21:44    3
21280070    2099726 17:23:19    speaking_agent  95                      2099726 21280070    incoming_call   17:23:19    95
21280070    NULL    17:23:20    in_queue        1                       NULL    NULL        NULL            NULL     NULL
21280070    2098692 17:23:21    agent_dialing   1                       2098692 21280070    dialing         17:23:21    1
21280070    2098692 17:23:27    agent_ringing   6                       2098692 21280070    ringing         17:23:27    6
21280070    2098692 17:23:37    speaking_agent  10                      2098692 21280070    incoming_call   17:23:37    10
NULL        NULL    NULL        NULL            NULL                    2098692 21280070    wrapup          17:23:57    20

我尝试了以下代码:

SELECT *
FROM table a
FULL OUTER JOIN table b 
ON a.CallId = b.CallId AND a.ASId = b.ASId AND a.DateTime = b.DateTime
WHERE a.CallId = 21280070 
ORDER BY a.DateTime

我得到的行比预期少了,最后一行包含了总结:

A.CallId    A.ASId  A.DateTime  A.CallStatus    A.DurationSeconds       B.ASId  B.CallId    B.CallDetails   B.DateTime  B.Duration
21280070    NULL    17:21:38    in_queue        1                       NULL    NULL        NULL            NULL    NULL
21280070    2099726 17:21:41    agent_dialing   3                       2099726 21280070    dialing         17:21:41    3
21280070    2099726 17:21:44    agent_ringing   3                       2099726 21280070    ringing         17:21:44    3
21280070    2099726 17:23:19    speaking_agent  95                      2099726 21280070    incoming_call   17:23:19    95
21280070    NULL    17:23:20    in_queue        1                       NULL    NULL        NULL            NULL     NULL
21280070    2098692 17:23:21    agent_dialing   1                       2098692 21280070    dialing         17:23:21    1
21280070    2098692 17:23:27    agent_ringing   6                       2098692 21280070    ringing         17:23:27    6
21280070    2098692 17:23:37    speaking_agent  10                      2098692 21280070    incoming_call   17:23:37    10

有人知道为什么会这样吗?我不明白为什么最后一行没有显示。

非常感谢。

亲切的问候!

1 个答案:

答案 0 :(得分:2)

由于a.CallId = 21280070。因为当JOIN不成功时,a.CallId的值为NULL,因此该子句将不成立。

一个猜测,您可能想要其中之一:

WHERE 21280070 IN (a.CallId,b.CallId)

WHERE a.CallId = 21280070
   OR b.CallId = 21280070