【问题标题】:Different count results with join加入不同的计数结果
【发布时间】:2013-12-23 10:39:22
【问题描述】:

我有那个sql

SELECT DISTINCT 
  count(KTT)
FROM 
  TRA.EVENT;

它返回一个数字 1901335。

现在我想用 join 像这样扩展 sql:

SELECT DISTINCT 
  count(E.KTT)
FROM 
  TRA.EVENT E
LEFT JOIN TRA.TMP_BNAME TBN ON E.KTT = TBN.KTT_DEF;

但这里我有一个 1942376 的结果。

我不明白为什么?我也希望得到 1901335 的结果。我想我很容易根据EVENT 的条目join 来自TBN 的值?

编辑

SELECT DISTINCT 
  E.KTT,
  TB.B_BEZEICHNER
FROM 
  TRA.EVENT E
LEFT JOIN TRA.TMP_BNAME TBN ON E.KTT = TBN.KTT_DEF
LEFT JOIN TRA.TMP_B TB ON TBN.B_ID = TB.B_ID;

我做错了什么?

感谢您的帮助。 斯蒂芬

【问题讨论】:

    标签: sql select join count distinct


    【解决方案1】:

    您尚未提供完整的详细信息,因此请将这些 cmets 视为一般的。

    当您连接 2 个表时,它可能会从一个表创建“重复”行。在您的实例中,TRA.TMP_BNAME 表中可能有超过 1 条具有相同 KTT_DEF 的记录。当您将其加入TRA.EVENT 表时,它会为TRA.EVENT 表中的每条原始记录创建多个记录。

    您可以选择计算KTTTRA.EVENT 的不同值并使用DISTINCT 关键字,但您需要将其放入COUNTSELECT COUNT(DISTINCT E.KTT)。如果您的价值观实际上是独一无二的,这将起作用。如果不是,则计数将与第一个查询不同。

    【讨论】:

    • @StefanBeike - 你想用LEFT JOIN 做什么?如果你不是为了行乘效应而这样做似乎毫无意义。
    • 我想加入第三张表。但在我测试当前加入之前,我有点困惑。让我编辑我的答案。
    • @StefanBeike 将DISTINCT 放入COUNT。如果您的价值观实际上是独一无二的,那么这将起作用。如果不是,则计数将与第一个查询不同。
    【解决方案2】:

    您想计算不同的 KTT 吗? 那么你的代码是错误的。你必须使用:

    SELECT     count(DISTINCT KTT) 
    FROM    TRA.EVENT;
    

    你得到不同的计数,因为你计算每一行。不是不同的。并且因为联接向查询中添加了更多行,这就是您获得更大数字的原因。

    【讨论】:

      【解决方案3】:

      试试这个:

      SELECT COUNT(DISTINCT E.KTT)
      FROM TRA.EVENT E
      LEFT JOIN TRA.TMP_BNAME TBN ON E.KTT = TBN.KTT_DEF;
      

      【讨论】:

        猜你喜欢
        • 2016-09-25
        • 1970-01-01
        • 2012-09-26
        • 1970-01-01
        • 1970-01-01
        • 2017-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多