让这个,一次一个。
首先,JOIN
要在FROM
子句中制作表格。WHERE
子句紧随其后。所以,一个有效的查询应该是(注意我们不能WHERE
在一个简单的查询中包含 2 个子句,所以这两个条件必须与一个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、nn),查询可能会给出错误的计数,因为连接可能会为特定的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'
) ;