SQLのdistinctは使い所によっては、必要なキーワードだが、訳も分からず使われている事も多い。「膨らんだから書いとけ!」見たいな感じで。
若者のSQLを見ていると、同じ使い方が多いことに気づいた。例えば
foo: id, name
bar: id, foo_id, flag
というテーブル構成で、「barでflagがたっているfooの行を取得」が課題だった場合
select
f.id, f.name
from
foo f inner join bar b on b.foo_id = f.id
where
b.flag = true
と書いてしまったが為に、最終的にselect句にdistinctをつけるはめに。。
これは「fooからデータを取得する際の抽出条件」と認識すれば
select
f.id, f.name
from
foo f
where
exists (select 'x' from bar b where b.foo_id = f.id and b.flag = true)
と書けるはずで、distinct は不要だ。
selectは、縦*横の新しい表を取得する物で、「1行が意味する概念」は何かを、はっきり意識できていないからではと思う。
0 件のコメント:
コメントを投稿