SQL 中的 LISTAGG 返回具有空值的行
Posted
技术标签:
【中文标题】SQL 中的 LISTAGG 返回具有空值的行【英文标题】:LISTAGG in SQL is returning a row with null values 【发布时间】:2021-05-27 12:13:05 【问题描述】:我有 2 个表 A 和 B,B 与 A 有外键关系,即 (b.detail_id = a.id) 我想对 B 中的一列应用 LISTAGG 查询。
SELECT LISTAGG(DISTINCT b.delivery_cadence, ',') WITHIN GROUP (ORDER BY b.delivery_cadence)
delivery_cadence, a.id FROM A a, B b WHERE b.detail_id = a.id AND a.id = 1236565;
上面的查询返回给我一个所有值都为空的行,但我不想要任何行。我怎样才能做到这一点? 如果不可能有任何替代解决方案。
A表中不存在a.id = 1236565。
【问题讨论】:
a.detail_id = a.id
?
抱歉,我的错误b.detail_id = a.id
已编辑
使用显式连接而不是隐式连接,这意味着使用join ... on
并停止使用,
来连接表。
【参考方案1】:
只需添加having count(b.delivery_cadence) > 0
例如
SELECT LISTAGG(DISTINCT b.delivery_cadence, ',') WITHIN GROUP (ORDER BY b.delivery_cadence)
delivery_cadence, a.id FROM A a, B b WHERE b.detail_id = a.id AND a.id = 1236565
HAVING COUNT(b.delivery_cadence) > 0
【讨论】:
应该有count(b.delivery_cadence) > 0
来排除带有all空值的ID【参考方案2】:
假设您有这样的表格:
create table a(id) as
(
select 1 from dual union all
select 2 from dual
);
create table b(detail_id, delivery_cadence) as
(
select 1, 'x' from dual union all
select 1, 'A' from dual union all
select 2, 'y' from dual
);
如果我理解得很好,你需要(在 ANSI 连接语法中):
SQL> SELECT LISTAGG(DISTINCT b.delivery_cadence, ',') WITHIN GROUP (ORDER BY b.delivery_cadence) delivery_cadence,
2 a.id
3 FROM A
4 inner join B ON b.detail_id = a.id
5 where a.id = 1236565
6 group by a.id;
no rows selected
对于表中存在的ID
值,您会得到:
SQL> SELECT LISTAGG(DISTINCT b.delivery_cadence, ',') WITHIN GROUP (ORDER BY b.delivery_cadence) delivery_cadence,
2 a.id
3 FROM A
4 inner join B ON b.detail_id = a.id
5 where a.id = 1
6 group by a.id;
DELIVERY_CADENCE ID
---------------- ----------
A,x 1
1 row selected.
【讨论】:
感谢正确的JOIN
语法。以上是关于SQL 中的 LISTAGG 返回具有空值的行的主要内容,如果未能解决你的问题,请参考以下文章