DB2 中 order by 子句的相关子查询
Correlated subquery in order by clause in DB2
我有一个类似于以下的查询,想知道 DB2 是否抱怨 ORDER BY 子句中的相关性使用。它出错了
[42703][-206] "A.ID" is not valid in the context where it is used..
SQLCODE=-206, SQLSTATE=42703
我能够重写查询以避免相关性使用,但我在文档中找不到关于此的参考。这是错误还是我只是找不到有关预期行为的详细信息?
SELECT a.id
FROM A a
ORDER BY (
SELECT COUNT(*)
FROM B b
WHERE b.id = a.id
)
您不能在 order by 子句中使用相关查询。但是有很多方法可以得到相同的结果,例如
select count(*) as count_num ,a.ID
from
a join b on a.ID=b.ID
GROUP BY a.ID
order by 1 DESC
解决方案 1:
SELECT a.id, (select count(*) from B where B.id=a.id) nbOFB
FROM A
order by 2
解决方案 2:
select * from (
SELECT a.id, (select count(*) from B where B.id=a.id) nbOFB
FROM A
) tmp
order by nbOFB
解决方案 3:
SELECT a.id, c.nb
FROM A
inner join lateral
(
select count(*) nb from B where B.id=a.id
) c on 1=1
order by c.nb
解决方案 4:
SELECT a.id, ifnull(c.nb, 0) nb
FROM A
left outer join
(
select b.id, count(*) nb from B group by b.id
) c on a.id=c.id
order by ifnull(c.nb, 0)
解决方案 5:
with c as (
select b.id, count(*) nb from B group by b.id
)
SELECT a.id, ifnull(c.nb, 0) nb
FROM A left outer join c on a.id=c.id
order by ifnull(c.nb, 0)
我有一个类似于以下的查询,想知道 DB2 是否抱怨 ORDER BY 子句中的相关性使用。它出错了
[42703][-206] "A.ID" is not valid in the context where it is used.. SQLCODE=-206, SQLSTATE=42703
我能够重写查询以避免相关性使用,但我在文档中找不到关于此的参考。这是错误还是我只是找不到有关预期行为的详细信息?
SELECT a.id
FROM A a
ORDER BY (
SELECT COUNT(*)
FROM B b
WHERE b.id = a.id
)
您不能在 order by 子句中使用相关查询。但是有很多方法可以得到相同的结果,例如
select count(*) as count_num ,a.ID
from
a join b on a.ID=b.ID
GROUP BY a.ID
order by 1 DESC
解决方案 1:
SELECT a.id, (select count(*) from B where B.id=a.id) nbOFB
FROM A
order by 2
解决方案 2:
select * from (
SELECT a.id, (select count(*) from B where B.id=a.id) nbOFB
FROM A
) tmp
order by nbOFB
解决方案 3:
SELECT a.id, c.nb
FROM A
inner join lateral
(
select count(*) nb from B where B.id=a.id
) c on 1=1
order by c.nb
解决方案 4:
SELECT a.id, ifnull(c.nb, 0) nb
FROM A
left outer join
(
select b.id, count(*) nb from B group by b.id
) c on a.id=c.id
order by ifnull(c.nb, 0)
解决方案 5:
with c as (
select b.id, count(*) nb from B group by b.id
)
SELECT a.id, ifnull(c.nb, 0) nb
FROM A left outer join c on a.id=c.id
order by ifnull(c.nb, 0)