我有一个问题,我可以说得对。所以这是我的场景: 我有一个名为'Couriers'的父表,然后1个快递可能有1个或多个'信使'然后Couriers有一个名为'Control'的第二个表,我控制快递员有多少信使。 结构如下:
'Courier'
idCourier(pk)
181
162
101
'Messenger'
idMessenger (pk), idCourier (fk)
1 101
2 181
3 101
4 101
5 162
'Control'
idCourier(pk, fk), maxNumberOfMessengers, idSupervisor
181 20 146
181 20 149
162 10 129
162 10 130
162 10 138
162 10 139
101 0 83
101 0 86
所以下一个查询:
SELECT COUNT(G.idCourier) AS NUM_COURIER, G.idMessenger, SUM(T.maxNumberOfMessengers) AS TOTAL
FROM Courier M
LEFT JOIN Messenger G ON M.idCourier = G.idCourier
LEFT JOIN Control T ON T.idCourier = G.idCourier AND T.idCourier = M.idCourier
GROUP BY G.idMessenger
我明白了:
NUM_COURIER G.idMessenger TOTAL
2 181 40
4 162 40
6 101 0
我在期待:
NUM_COURIER G.idMessenger TOTAL
1 181 40
3 162 40
1 101 0
我在查询中遗漏或做错了什么? 在此先感谢!! :)
答案 0 :(得分:1)
我们每个快递有多少信使?
SELECT idCourier, COUNT(*) CourierCount FROM Messenger GROUP BY idCourier
现在加入此并与控件进行比较:
SELECT CO.idcourier,
CO.maxnumberofmessengers,
CC.couriercount
FROM control CO
INNER JOIN (SELECT idcourier,
Count(*) CourierCount
FROM messenger
GROUP BY idcourier) CC
ON CC.idcourier = CO.idcourier
答案 1 :(得分:0)
我之前的查询错误地认为我们需要计算Control表中的courier条目数,同时还要总结信使的数量。
SELECT COUNT(T.idCourier) AS NUM_COURIER, T.idCourier, SUM(T.maxNumberOfMessengers) AS TOTAL
FROM Control T
GROUP BY T.idCourier
我现在看到我们需要获得使者的数量。因此需要子查询:
SELECT Couriers.CourierCount as NUM_COURIER, Couriers.idCourier, MaxMessengers.TOTAL
FROM
(SELECT M.idCourier, COUNT(*) CourierCount FROM Messenger M GROUP BY M.idCourier) Couriers
JOIN(SELECT C.idCourier, SUM(C.maxNumberOfMessengers) AS TOTAL From Control C GROUP BY C.idCourier) MaxMessengers
ON MaxMessengers.idCourier = Couriers.idCourier
答案 2 :(得分:0)
我不熟悉Oracle,所以我希望这很有用,因为这是使用MS Sql执行此操作的方法。
SELECT COUNT(G.idCourier) AS NUM_COURIER,
m.idcourier,
(
SELECT sum(maxnumberofmessengers)
FROM CONTROL con
WHERE con.idcourier = m.idcourier
GROUP BY con.idcourier
) AS TOTAL
FROM Courier M
JOIN Messenger G ON M.idCourier = G.idCourier
GROUP BY m.idcourier
答案 3 :(得分:0)
courier
表和control
表由idcourier
和courier
表连接,messenger
表也由idcourier
连接但{{{} 1}}表和messenger
表根本没有连接。另一件事是control
单独根据其数据不能在idcourier
表中使用pk。它有重复的数据。
control