简单查询 - 为什么会抛出错误?

时间:2013-04-13 17:50:28

标签: mysql sql

我很难在没有错误的情况下处理此查询。你能让我走上正轨吗?我花了大约一个小时的变化。

正如您所看到的,我正在努力获得等于casetype_txt的{​​{1}}字段的总记录数,然后在'DONATION'表中获取所有B这不是空值。因此,我想要实现一个总计数。

Groups

2 个答案:

答案 0 :(得分:2)

您的语法不正确,请尝试一下,

SELECT  COUNT(casetype_txt) 
FROM    amd_full_merged_st_load_case AS a 
        LEFT JOIN amd_full_merged_st_load_case AS b
            ON  a.case_id = b.case_id AND
                b.group != ''
WHERE   a.casetype_txt = 'DONATION'  

要进一步了解联接,请访问以下链接:

答案 1 :(得分:1)

让我们一次一个。

首先,表JOIN将在FROM子句中生成。之后出现WHERE条款。因此,一个有效的查询将是(注意我们在一个简单的查询中不能有2个WHERE子句,因此这两个条件必须与AND组合 - 或者有时与OR组合但可能不是这里的情况):

-- Version 1 --
SELECT
  COUNT(a.casetype_txt)

FROM
  amd_full_merged_st_load_case AS a

  LEFT JOIN amd_full_merged_st_load_case AS b
    ON a.case_id=b.case_id

WHERE
  a.casetype_txt = 'DONATION'

  AND b.group <> '' ;

现在,因为b子句中有LEFT表(WHERE外连接右侧的表)的条件,这使得外连接工作作为内部联接。因此,上述查询相当于:

-- Version 2 --
SELECT
  COUNT(a.casetype_txt)

FROM
  amd_full_merged_st_load_case AS a

  INNER JOIN amd_full_merged_st_load_case AS b
    ON a.case_id=b.case_id

WHERE
  a.casetype_txt = 'DONATION'

  AND b.group <> '' ;

以上(第2版)可能就是你所追求的。还有另一个问题。根据两个表(1-1,1-n,n-1,n-n)之间的关系,查询可能会给出错误的计数,因为连接可能会为特定的case_id生成许多行。因此,您还应检查将连接转换为半连接(使用EXISTS子查询)是否为您提供了所需的答案:

-- Version 3a --
SELECT
  COUNT(a.*)                                     -- we want to count rows

FROM
  amd_full_merged_st_load_case AS a              -- from table a

WHERE                                            -- where
  a.casetype_txt = 'DONATION'                    -- casetype is DONATION
                                                 -- and
  AND EXISTS                                     -- at least one 
      ( SELECT *                                 -- (related row) exists
        FROM amd_full_merged_st_load_case AS b   -- in table b
        WHERE a.case_id = b.case_id              
          AND b.group <> ''
      ) ;

或:

-- Version 3b --
SELECT
  COUNT(b.*)                                     -- we want to count rows

FROM
  amd_full_merged_st_load_case AS b              -- from table b

WHERE                                            -- where
  b.group <> ''                                  -- group is not empty
                                                 -- and
  AND EXISTS                                     -- at least one 
      ( SELECT *                                 -- (related row) exists
        FROM amd_full_merged_st_load_case AS a   -- in table a
        WHERE a.case_id = b.case_id              
          AND a.casetype_txt = 'DONATION'        
      ) ;