我的查询有什么问题?

时间:2014-02-17 01:50:28

标签: sql oracle

我有一个问题,我可以说得对。所以这是我的场景: 我有一个名为'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

我在查询中遗漏或做错了什么? 在此先感谢!! :)

4 个答案:

答案 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表由idcouriercourier表连接,messenger表也由idcourier连接但{{{} 1}}表和messenger表根本没有连接。另一件事是control单独根据其数据不能在idcourier表中使用pk。它有重复的数据。

control