クエリで複数の左結合を使用することに少し問題があります。一部のテーブルは左側のテーブルと1対1の関係にあり、一部のテーブルは1対多の関係にあります。クエリは次のようになります。
Select
files.filename,
coalesce(count(distinct case
when dm_data.weather like '%clear%' then 1
end),
0) as clear,
coalesce(count(distinct case
when dm_data.weather like '%lightRain%' then 1
end),
0) as lightRain,
coalesce(count(case
when kc_data.type like '%bicycle%' then 1
end),
0) as bicycle,
coalesce(count(case
when kc_data.type like '%bus%' then 1
end),
0) as bus,
coalesce(count(case
when kpo_data.movement like '%walking%' then 1
end),
0) as walking,
coalesce(count(case
when kpo_data.type like '%pedestrian%' then 1
end),
0) as pedestrian
from
files
left join
dm_data ON dm_data.id = files.id
left join
kc_data ON kc_data.id = files.id
left join
kpo_data ON kpo_data.id = files.id
where
files.filename in (X, Y, Z, ........)
group by files.filename;
ここで、dm_dataテーブルは「files」テーブルと1対1の関係にあり(そのため、「Distinct」を使用しています)、kc_dataおよびkpo_dataデータは「files」テーブルと1対多の関係にあります。(kc_dataおよびkpo_dataは、1つのfiles.idに対して10〜20行を持つことができます)。このクエリは正常に機能します。
この問題は、別の1対多のテーブルpd_markings(1つのfiles.idに対して数百の行を持つ可能性がある)に別の左結合を追加すると発生します。
Select
files.filename,
coalesce(count(distinct case
when dm_data.weather like '%clear%' then 1
end),
0) as clear,
coalesce(count(distinct case
when dm_data.weather like '%lightRain%' then 1
end),
0) as lightRain,
coalesce(count(case
when kc_data.type like '%bicycle%' then 1
end),
0) as bicycle,
coalesce(count(case
when kc_data.type like '%bus%' then 1
end),
0) as bus,
coalesce(count(case
when kpo_data.movement like '%walking%' then 1
end),
0) as walking,
coalesce(count(case
when kpo_data.type like '%pedestrian%' then 1
end),
0) as pedestrian,
**coalesce(count(case
when pd_markings.movement like '%walking%' then 1
end),
0) as walking**
from
files
left join
dm_data ON dm_data.id = files.id
left join
kc_data ON kc_data.id = files.id
left join
kpo_data ON kpo_data.id = files.id
left join
**kpo_data ON pd_markings.id = files.id**
where
files.filename in (X, Y, Z, ........)
group by files.filename;
これで、すべての値が互いに倍数になります。何か案は???
最初の2列は1または0の値を返すことに注意してください。1対1の関係テーブルにはfiles.idに対して1行または0行しかないため、実際には望ましい結果です。したがって、「Distinct」を使用しない場合、結果の値は正しくありません(同じfile.idに対して複数の行を返す他のテーブル)いいえ、残念ながら、私のテーブルには、「files」テーブルを除いて独自の一意のID列がありません。