我需要编写一个查询以显示where条件中存在的所有记录,如果该列没有任何值,则应返回0。
如何在不使用双表的情况下编写此查询?
SELECT city, count(city)
FROM Customers
where City IN ('ABCD','US' )
group by city;
输入
City
US
输出应为
ABCD 0
US 1
答案 0 :(得分:3)
您可以使用集合并使用左外部联接代替in()
:
select t.column_value as city, count(c.city) as city_count
from table(sys.odcivarchar2list('ABCD','US')) t
left join customers c
on c.city = t.column_value
group by t.column_value
order by city;
CITY CITY_COUNT
---------- ----------
ABCD 0
US 1
sys.odcivarchar2list
是内置的集合类型,在这种情况下,它是使用2或100或要查找的许多值的列表初始化的。
table()
是一个表集合表达式,它将列表扩展为单独的行,每个列表值一个。的结果集只有一列,您可以将其称为column_value
。
然后可以将这些扩展的行保留在您的客户表中,以进行汇总计数。由于存在外部联接,因此列表中客户表中没有匹配项的任何值将报告为零。
或者您可以使用XQuery序列,但是列表很难构建:
select x.city, count(c.city) as city_count
from xmltable('"ABCD","US"' columns city varchar2(10) path '.') x
left join customers c
on c.city = x.city
group by x.city
order by city;
CITY CITY_COUNT
---------- ----------
ABCD 0
US 1
如果您传递的是包含逗号分隔值而不是实际值列表的单个字符串,那么这将很有用。