問題は、結合したままのテーブルに複数の一致があることです。事実上、あなたのコードは次のように言っています:
select *
from parent
left outer join child on parent.id = child.parentId
親に2人の子供がいる場合は、両方を取得します。したがって、親は2回表示されます。
妥協する必要がある場合にのみ親を取得したい場合。両方の子供を持つことはできません。子テーブルの列に対して集計関数を実行し、親テーブルの列に対してgroup byを実行するか、次のようrownumber() over partition by (list,of,parent,columns order by list,of,child,columns) r
に内部ステートメントとwhere r=1
外部ステートメントで使用します。
select p.id, p.name, max(c.id), max(c.name) --nb: child id and name may come from different records
from parent p
left outer join child c on parent.id = child.parentId
group by p.id, p.name
また
select *
from
(
select p.id, p.name, c.id, c.name
, rownumber() over (partition by p.id order by c.id desc) r
from parent p
left outer join child c on parent.id = child.parentId
) x
where x.r = 1
アップデート
コメントで述べたように、子データがまったく同じである場合は、次のようにすることができます。
select p.id, p.name, c.name
from parent p
left outer join
(
select distinct c.parentId, c.name
from child
) c on parent.id = child.parentId
または(いくつかのフィールドが異なるが、どちらを取得してもかまわない場合)
select p.id, p.name, c.id, c.name
from parent p
left outer join
(
select max(c.id) id, c.parentId, c.name
from child
group by c.parentId, c.name
) c on parent.id = child.parentId