SQL-连接问题,行不匹配

SQL-连接问题,行不匹配,sql,sql-server,azure-sql-database,Sql,Sql Server,Azure Sql Database,我在尝试连接4个表时遇到了一个问题: +-----+-------------+--------+ | id: | P_duration: | T_id: | +-----+-------------+--------+ | a | 2 | a1 | | e | <null> | <null> | | h | 5 | <null> | +-----+-------------+------

我在尝试连接4个表时遇到了一个问题:

+-----+-------------+--------+
| id: | P_duration: | T_id:  |
+-----+-------------+--------+
| a   | 2           | a1     |
| e   | <null>      | <null> |
| h   | 5           | <null> |
+-----+-------------+--------+
+-----+--------------+---------+
| id: |  C_duration: |  T_id:  |
+-----+--------------+---------+
| l   |            4 |    a2   |
+-----+--------------+---------+
+---------+
|    T_id |
+---------+
|    a1   |
|    a2   |
|    a3   |
+---------+
对话:

+-----+---------+------------+
| id: | start:  |    end:    |
+-----+---------+------------+
| a   |  3      |    87      |
| e   |  <null> |   4        |
| h   |  4      |    67      |
| l   |  5      |    6       |
| o   |  <null> |  <null>    |
+-----+---------+------------+
+-----+-------------+--------+
| id: | P_duration: | T_id:  |
+-----+-------------+--------+
| a   | 2           | a1     |
| e   | <null>      | <null> |
| h   | 5           | <null> |
+-----+-------------+--------+
+-----+--------------+---------+
| id: |  C_duration: |  T_id:  |
+-----+--------------+---------+
| l   |            4 |    a2   |
+-----+--------------+---------+
+---------+
|    T_id |
+---------+
|    a1   |
|    a2   |
|    a3   |
+---------+
门票

+-----+-------------+--------+
| id: | P_duration: | T_id:  |
+-----+-------------+--------+
| a   | 2           | a1     |
| e   | <null>      | <null> |
| h   | 5           | <null> |
+-----+-------------+--------+
+-----+--------------+---------+
| id: |  C_duration: |  T_id:  |
+-----+--------------+---------+
| l   |            4 |    a2   |
+-----+--------------+---------+
+---------+
|    T_id |
+---------+
|    a1   |
|    a2   |
|    a3   |
+---------+
我想要得到的是这样的东西:

+-----+-------------+--------+
| id: | P_duration: | T_id:  |
+-----+-------------+--------+
| a   | 2           | a1     |
| e   | <null>      | <null> |
| h   | 5           | <null> |
+-----+-------------+--------+
+-----+--------------+---------+
| id: |  C_duration: |  T_id:  |
+-----+--------------+---------+
| l   |            4 |    a2   |
+-----+--------------+---------+
+---------+
|    T_id |
+---------+
|    a1   |
|    a2   |
|    a3   |
+---------+
结果:

+-----+-------------+--------+
| id: | P_duration: | T_id:  |
+-----+-------------+--------+
| a   | 2           | a1     |
| e   | <null>      | <null> |
| h   | 5           | <null> |
+-----+-------------+--------+
+-----+--------------+---------+
| id: |  C_duration: |  T_id:  |
+-----+--------------+---------+
| l   |            4 |    a2   |
+-----+--------------+---------+
+---------+
|    T_id |
+---------+
|    a1   |
|    a2   |
|    a3   |
+---------+
+--------+-------------+-------------+--------+
|  id:   | P_duration: | C_duration: | T_id:  |
+--------+-------------+-------------+--------+
| a      | 2           | <null>      | a1     |
| e      | <null>      | <null>      | <null> |
| h      | 5           | <null>      | <null> |
| l      | <null>      | 4           | a2     |
| o      | <null>      | <null>      | <null> |
| <null> | <null>      | <null>      | a3     |
+--------+-------------+-------------+--------+
不幸的是,这不起作用,因为我无法涵盖结果表案例的最后一行:当我有一张罚单但没有对话时

+-----+-------------+--------+
| id: | P_duration: | T_id:  |
+-----+-------------+--------+
| a   | 2           | a1     |
| e   | <null>      | <null> |
| h   | 5           | <null> |
+-----+-------------+--------+
+-----+--------------+---------+
| id: |  C_duration: |  T_id:  |
+-----+--------------+---------+
| l   |            4 |    a2   |
+-----+--------------+---------+
+---------+
|    T_id |
+---------+
|    a1   |
|    a2   |
|    a3   |
+---------+
我应该如何更改查询

+-----+-------------+--------+
| id: | P_duration: | T_id:  |
+-----+-------------+--------+
| a   | 2           | a1     |
| e   | <null>      | <null> |
| h   | 5           | <null> |
+-----+-------------+--------+
+-----+--------------+---------+
| id: |  C_duration: |  T_id:  |
+-----+--------------+---------+
| l   |            4 |    a2   |
+-----+--------------+---------+
+---------+
|    T_id |
+---------+
|    a1   |
|    a2   |
|    a3   |
+---------+

提前感谢

我建议
UNION ALL
带来与
phone
chat
表不匹配的票据:

+-----+-------------+--------+
| id: | P_duration: | T_id:  |
+-----+-------------+--------+
| a   | 2           | a1     |
| e   | <null>      | <null> |
| h   | 5           | <null> |
+-----+-------------+--------+
+-----+--------------+---------+
| id: |  C_duration: |  T_id:  |
+-----+--------------+---------+
| l   |            4 |    a2   |
+-----+--------------+---------+
+---------+
|    T_id |
+---------+
|    a1   |
|    a2   |
|    a3   |
+---------+
SELECT conv.id, p.P_duration, c.C_duration, t.T_id
FROM Conversations conv LEFT JOIN
     phone p
     ON p.id = conv.id LEFT JOIN
     chat c 
     ON c.id = conv.id LEFT JOIN
     ticket t 
     ON t.T_id IN (p.T_id, c.T_id)
UNION ALL
SELECT NULL, NULL, NULL, t.T_id
FROM ticket t
WHERE NOT EXISTS (SELECT 1
                  FROM phone p
                  WHERE t.T_id = p.T_id
                 ) AND
      NOT EXISTS (SELECT 1
                  FROM chat c
                  WHERE t.T_id = c.T_id
                 );

您应该能够在加入票证表时使用完全联接

+-----+-------------+--------+
| id: | P_duration: | T_id:  |
+-----+-------------+--------+
| a   | 2           | a1     |
| e   | <null>      | <null> |
| h   | 5           | <null> |
+-----+-------------+--------+
+-----+--------------+---------+
| id: |  C_duration: |  T_id:  |
+-----+--------------+---------+
| l   |            4 |    a2   |
+-----+--------------+---------+
+---------+
|    T_id |
+---------+
|    a1   |
|    a2   |
|    a3   |
+---------+
select conv.id, p.P_duration, c.C_duration, t.T_id
FROM Conversations conv
LEFT JOIN phone p on p.id = conv.id
LEFT JOIN chat c on c.id = conv.id
FULL JOIN ticket t on (t.T_id= p.T_id or t.T_id= c.T_id)

我不确定这里的性能。UNION ALL方法的性能可能更好。

完全联接不起作用,即使使用完全联接的性能优于UNION ALL。但他正在与所有工会合作。但我真的认为我的完全加入标准是不正确的。我把电话连在一起了。我会解决的,谢谢。我会全力以赴地等待你的解决方案。我在前面的评论中已经修复了它。如果它仍然不起作用,我不知道发生了什么。了解了。不幸的是,无法使用完全联接。我无法检索conv.id、p.p_duration、c.c_duration为null的行。谢谢。这确实有效,但速度很慢。你知道如何通过这个联盟提高绩效吗?@Giacky。您需要在
电话(T\u id)
聊天室(T\u id)
上建立索引。这就是说,这应该不会比原始查询慢很多。
+-----+-------------+--------+
| id: | P_duration: | T_id:  |
+-----+-------------+--------+
| a   | 2           | a1     |
| e   | <null>      | <null> |
| h   | 5           | <null> |
+-----+-------------+--------+
+-----+--------------+---------+
| id: |  C_duration: |  T_id:  |
+-----+--------------+---------+
| l   |            4 |    a2   |
+-----+--------------+---------+
+---------+
|    T_id |
+---------+
|    a1   |
|    a2   |
|    a3   |
+---------+