correct
この場合、列と列のincorrect
値が異なる理由がわかりません。正直に言うと、これが有効な SQL であるというのは奇妙に思えcross apply
ますgroup by
。
with Foo as (
select 1 as id, 'foo_1' as txt from Dual union all
select 2, 'foo_2' from Dual),
Bar as (
select 1 as id, 'bar_1' as txt, 1 as foo_id from Dual union all
select 2, 'bar_2', 1 from Dual union all
select 3, 'bar_3', 1 from Dual union all
select 4, 'bar_4', 2 from Dual)
select
f.id,
listagg(b.txt, ', ') within group (order by b.id) as correct,
incorrect
from Foo f
join Bar b on f.id = b.foo_id
cross apply (
select
listagg(txt, ', ') within group (order by id) as incorrect
from Bar
where foo_id = f.id)
group by f.id
order by f.id;
結果は次のとおりです。
ID CORRECT INCORRECT
1 bar_1, bar_2, bar_3 bar_4
2 bar_4 bar_4
しかし、そのgroup by
部分を削除して、次のように追加するとdistinct
:
with Foo as (
select 1 as id, 'foo_1' as txt from Dual union all
select 2, 'foo_2' from Dual),
Bar as (
select 1 as id, 'bar_1' as txt, 1 as foo_id from Dual union all
select 2, 'bar_2', 1 from Dual union all
select 3, 'bar_3', 1 from Dual union all
select 4, 'bar_4', 2 from Dual)
select distinct
f.id,
incorrect_now_correct
from Foo f
join Bar b on f.id = b.foo_id
cross apply (
select
listagg(txt, ', ') within group (order by id) as incorrect_now_correct
from Bar
where foo_id = f.id)
order by f.id;
次の結果が得られます。
ID INCORRECT_NOW_CORRECT
1 bar_1, bar_2, bar_3
2 bar_4
incorrect
これは、最初のクエリの列から期待した結果です。
節を使用する場合、group by
節の扱いは異なりgroup by
ますか? 今までは、サブクエリとのよりインテリジェントな結合だとしか思っていませんでした。パーツに追加incorrect
するとgroup by
、最初のクエリの結果で説明されているような動作になります。コンパイルして実行し、多少ランダムな値を返します。
編集:DBバージョンはOracle Database 12c Enterprise Edition 12.1.0.2.0です