解释我的问题的最简单方法可能是显示表格和我想要获得的结果。我最新尝试的查询位于底部(不起作用)
我有以下表格(为简单起见,删除了一堆列):
客户表:
------------------------- | client_id | name | ------------------------- | client_1 | Bob | ------------------------- | client_2 | Jane | ------------------------- | client_3 | Amy | -------------------------
合约表:
--------------------------------------------- | contract_id | client_id | amount | date | --------------------------------------------- | contract_1 | client_1 | $5 | 01/02 | --------------------------------------------- | contract_2 | client_1 | $25 | 21/03 | --------------------------------------------- | contract_3 | client_2 | $40 | 25/05 | ---------------------------------------------
会话表:
------------------------------------------ | session_id | client_id | contract_id | ------------------------------------------ | session_1 | client_1 | contract_1 | ------------------------------------------ | session_2 | client_2 | contract_3 | ------------------------------------------ | session_3 | client_2 | contract_3 | ------------------------------------------ | session_4 | client_1 | contract_2 | ------------------------------------------ | session_5 | client_1 | contract_1 | ------------------------------------------
我需要加入表并按client_id和contract_id对所有行进行分组,如下所示:
client 1, Bob
|___ contract_1, $5, 01/02
|___ Session 1
|___ Session 5
|___ contract_2, $25, 21/03
|___ Session 4
client 2, Jane
|___ contract_3, $40, 25/05
|___ Session 2
|___ Session 3
client 3, Amy
我最近的尝试是在表上进行完全外连接,并按client_id和contract_id对结果进行分组。
SELECT * FROM
(SELECT
*
FROM
contracts
LEFT OUTER JOIN
clients
ON
clients.client_id = contracts.client_id
UNION
SELECT
*
FROM
contracts
LEFT OUTER JOIN
sessions
ON
sessions.client_id = contracts.client_id)
AS tmp_table GROUP BY client_id, contract_id
完整的外连接解决方法失败,因为各个表中的列数不同(我需要所有列,所以我在那里运气不好),它看起来像" GROUP BY"每个只返回1行(由于我需要所有的行,这对我来说也不起作用。
在这种情况下,性能完全没有问题。
SQL fiddle based on Ronald's answer
它看起来像我需要的东西。在我批准答案之前,我会将它调整到我的生产表中,看看是否有一些我忽略的东西
答案 0 :(得分:1)
以下查询是否会提供所需的结果?
select cl.client_id, cl.name, co.contract_id, co.amount, co.date, se.session_id
from (client cl left join contract co
on cl.client_id = co.client_id) left join session se
on co.contract_id = se.contract_id
order by cl.client_id, co.contract_id, se.session_id
(正如其中一条评论中已经指出的那样:select语句的结果总是一个表)
还有一个小问题:为什么client_id是会话表的一部分?它是超定的,这可能会导致数据库中出现歧义。