SQL:如何让我的计数具体?

时间:2014-11-10 18:57:06

标签: sql oracle join count

我再次迷失在我的联盟中。

我的数量应该是4而不是16。 有人可以帮我吗?我自己找不到问题。

    SELECT  COUNT(TRK.REACTIE_ID) AS AANTAL_REACTIES,
            AVG(W.WAARDERING) AS AANTAL_STERREN,
            S.UITGEVER,
            S.NAAM AS TVSHOW_NAAM,
            S.BESCHRIJVING,
            S.AFBEELDING_BESTANDSPAD,
            S.ONDERTITEL,
            S.WEBSITE,
            C.NAAM AS CATEGORIE,
            A.AFBEELDING_BESTANDSPAD,
            A.VIDEO_BESTANDSPAD,
            A.AFLEVERINGNR AS AFLEVERING,
            A.SEIZOENNR AS SEIZOEN,
            A.NAAM AS AFLEVERING_NAAM,
            A.DUUR AS MINUTEN
FROM  CATEGORIEEN_KOPPELTABEL CK 
      JOIN CATEGORIE C ON C.CATEGORIE_ID = CK.CATEGORIE_ID 
         JOIN TV_SHOW S ON S.TV_SHOW_ID = CK.TV_SHOW_ID AND S.NAAM = 'South Park' 
          LEFT JOIN TVSHOW_REACTIES_KOPPELTABEL TRK ON TRK.TV_SHOW_ID = S.TV_SHOW_ID
                 LEFT JOIN WAARDERING_TVSHOW W ON W.TV_SHOW_ID = S.TV_SHOW_ID
                            JOIN AFLEVERING A ON A.TV_SHOW_ID = S.TV_SHOW_ID 
                             WHERE a.airdate = (SELECT MAX(TO_DATE(AIRDATE, 'DD:MM:YYYY')) 
                                                FROM AFLEVERING)                        
GROUP BY    TRK.TV_SHOW_ID,
            S.UITGEVER,
            S.NAAM,
            S.BESCHRIJVING,
            S.AFBEELDING_BESTANDSPAD,
            S.ONDERTITEL,S.WEBSITE, 
            C.NAAM,
            A.AFBEELDING_BESTANDSPAD,
            A.VIDEO_BESTANDSPAD,
            A.AFLEVERINGNR,
            A.SEIZOENNR,
            A.NAAM,
            A.DUUR,
            W.TV_SHOW_ID;

RESULT OF THE QUERY 这是我目前的结果,但有4个反应记录。

1 个答案:

答案 0 :(得分:0)

  

“我的数量应该是4而不是16。”

这表示缺少JOIN条件或WHERE过滤器。这种事情只能通过比较原始数据,即输入数据和输出,并查看哪些值过于频繁来诊断。如果您无法立即看到此消息,请删除聚合和group by子句,并可能添加一些主键列。

一个线索是聚合应用于具有外连接的表中的值:

LEFT JOIN TVSHOW_REACTIES_KOPPELTABEL TRK ON TRK.TV_SHOW_ID = S.TV_SHOW_ID
LEFT JOIN WAARDERING_TVSHOW W ON W.TV_SHOW_ID = S.TV_SHOW_ID

外连接可以吸入我们不期望的行,因此您应该检查您尝试实现的逻辑。

另一件事:不要在JOIN子句中混合过滤条件。 ANSI 92语法的重点是将它们分开。所以这应该在WHERE子句中:

AND S.NAAM = 'South Park' 

它可能不会影响实际结果,但有时可能会影响实际结果。