1

「sending_fresh」と「agents」の 2 つのテーブルがあります。

「cc」が「sending_fresh」からの特定の日付と「agents」からの特定のチームに等しい合計を取得したいと思います。

私は現在持っています:

SELECT SUM(sending_fresh.cc), agents.team  
FROM sending_fresh, agents 
WHERE agents.team = 'team1' 
AND sending_fresh.date = '2012-05-12'

「sending_fresh」テーブルのみから選択した場合、合計は正常に機能しますが、2 番目のテーブルから WHERE ステートメントを追加すると、はるかに高く間違った答えが返されます。

誰でも助けることができますか?

4

1 に答える 1

2

主な回答

の外部キーはsending_fresh、表のagent_idに対応しています。idagents

JOIN 条件がなく、GROUP BY 句がありません。

SELECT SUM(s.cc), a.team  
  FROM sending_fresh AS s
  JOIN agents        AS a ON a.id = s.agent_id
 WHERE a.team = 'team1' 
   AND s.date = '2012-05-12'
 GROUP BY a.team;

結合に関する情報を入手する前に、私は次のように書きました。

SELECT SUM(s.cc), a.team  
  FROM sending_fresh AS s
  JOIN agents        AS a ON a.team = s.team    -- Guess at join columns!
 WHERE a.team = 'team1' 
   AND s.date = '2012-05-12'
 GROUP BY a.team;

結合条件を見逃したので、それが何であるかを推測する必要があります。代わりに、a.team_id = s.team_idまたはそのようなものである可能性があります。

結合がオンの場合、sending_fresh.team必要に応じて結合を完全に回避できます。

SELECT SUM(cc), team  
  FROM sending_fresh
 WHERE team = 'team1' 
   AND date = '2012-05-12'
 GROUP BY team;

この単純化は、スキーマがより詳細に知られている現在では有効ではありません。


一般的なコメント

明示的な JOIN を使用すると、結合条件を忘れてはならないことに注意してください。FROM 句では、テーブル表記のカンマ リストを使用しないでください。古い SQL を認識するためには、それを理解する必要があります。新しい SQL では絶対に使用しないでください。代わりに明示的な結合を使用するように古い SQL をアップグレードする必要があります。

クエリに N 個のテーブルがある場合、N-1 個の結合条件が必要であることに注意してください。

于 2012-07-13T20:17:23.480 に答える