将 Postgres 上的查询更改为仅使用标准 SQL 子句
Changing a query on Postgres to use only the Standard SQL Clauses
我在 Postgres 上做了一个查询,我使用了 Postgres 9.4 或更高版本中可用的 FILTER 子句,但我被告知我只能使用标准 SQL 子句。
我的查询是统计屠宰了多少动物,每个企业屠宰动物的数量和动物种类:
Enterprise(id or name) || cow || sheep || chicken
MacDonals || 5 || 5 || 1
Burguer King || 7 || 4 || 2
KFC || 1 || 0 || 10
所以我在 POSTGRES 9.4 上进行了本机查询:
SELECT e.name
,COALESCE (COUNT(a.id) FILTER (WHERE a.type='cow'))
,COALESCE (COUNT(a.id) FILTER (WHERE a.type='sheep'))
,COALESCE (COUNT(a.id) FILTER (WHERE a.type='chicken'))
FROM enterprise e
INNER JOIN animal_enterprise ae
ON ( ae.enterprise_id = e.id)
INNER JOIN animal a
ON ( ae.animal_id=a.id )
GROUP BY e.id
所以,我已经尝试对每种动物进行子查询,但效果并不理想。
如果我正确理解 filter
的工作原理,可以使用 count
函数中的 case
表达式来翻译:
SELECT e.name
,COUNT(case when a.type='cow' then 'X' end) as cow
,COUNT(case when a.type='sheep' then 'X' end) as sheep
,COUNT(case when a.type='chicken' then 'X' end) as chicken
FROM enterprise e
INNER JOIN animal_enterprise ae
ON ae.enterprise_id = e.id
INNER JOIN animal a
ON ae.animal_id = a.id
GROUP BY e.id, e.name
我忽略了您查询中的一些异常情况,例如使用 p.id
??当没有在任何地方定义别名 p
时,或者使用没有第二个参数的 coalesce
时。
我在 Postgres 上做了一个查询,我使用了 Postgres 9.4 或更高版本中可用的 FILTER 子句,但我被告知我只能使用标准 SQL 子句。
我的查询是统计屠宰了多少动物,每个企业屠宰动物的数量和动物种类:
Enterprise(id or name) || cow || sheep || chicken
MacDonals || 5 || 5 || 1
Burguer King || 7 || 4 || 2
KFC || 1 || 0 || 10
所以我在 POSTGRES 9.4 上进行了本机查询:
SELECT e.name
,COALESCE (COUNT(a.id) FILTER (WHERE a.type='cow'))
,COALESCE (COUNT(a.id) FILTER (WHERE a.type='sheep'))
,COALESCE (COUNT(a.id) FILTER (WHERE a.type='chicken'))
FROM enterprise e
INNER JOIN animal_enterprise ae
ON ( ae.enterprise_id = e.id)
INNER JOIN animal a
ON ( ae.animal_id=a.id )
GROUP BY e.id
所以,我已经尝试对每种动物进行子查询,但效果并不理想。
如果我正确理解 filter
的工作原理,可以使用 count
函数中的 case
表达式来翻译:
SELECT e.name
,COUNT(case when a.type='cow' then 'X' end) as cow
,COUNT(case when a.type='sheep' then 'X' end) as sheep
,COUNT(case when a.type='chicken' then 'X' end) as chicken
FROM enterprise e
INNER JOIN animal_enterprise ae
ON ae.enterprise_id = e.id
INNER JOIN animal a
ON ae.animal_id = a.id
GROUP BY e.id, e.name
我忽略了您查询中的一些异常情况,例如使用 p.id
??当没有在任何地方定义别名 p
时,或者使用没有第二个参数的 coalesce
时。