SQL-连接问题,行不匹配
我在尝试连接4个表时遇到了一个问题: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> | +-----+-------------+------
+-----+-------------+--------+
| 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 |
+---------+