まず、それ(id)
がテーブルの主キーであると仮定しましょう。この場合、はい、結合は(証明できる)冗長であり、削除することができます。
さて、それは単なる理論-または数学です。オプティマイザーが実際の削除を行うためには、理論をコードに変換し、オプティマイザーの最適化/書き換え/削除のスイートに追加する必要があります。それを実現するために、(DBMS)開発者は、効率に優れたメリットがあり、十分に一般的なケースであると考える必要があります。
個人的には、そのようには聞こえません(十分に一般的です)。クエリは-あなたが認めるように-かなりばかげて見えます、そしてそれが改善されてそして冗長な結合が削除されない限り、レビュアーはレビューを通過させるべきではありません。
とはいえ、消去が行われる同様のクエリがあります。Rob Farleyによる非常に優れた関連ブログの投稿:SQL ServerでのJOINの簡素化。
私たちの場合、結合をLEFT
結合に変更するために実行する必要があるすべてのこと。dbfiddle.ukを参照してください。この場合のオプティマイザは、結果を変更することなく、結合を安全に削除できることを認識しています。(単純化ロジックは非常に一般的であり、自己結合では特別なケースではありません。)
もちろん、元のクエリでは、INNER
結合を削除しても結果が変わる可能性はありません。ただし、主キーで自己結合することはまったく一般的ではないため、オプティマイザはこのケースを実装していません。ただし、結合(または左結合)が一般的です。結合された列は、いずれかのテーブルの主キーです(多くの場合、外部キー制約があります)。これは、結合を排除する2番目のオプションにつながります:(自己参照!)外部キー制約を追加します。
ALTER TABLE "Table"
ADD FOREIGN KEY (id) REFERENCES "Table" (id) ;
そして出来上がり、結合が削除されます!(同じフィドルでテスト済み):ここに
create table docs
(id int identity primary key,
doc varchar(64)
) ;
GO
✓
insert
into docs (doc)
values ('Enter one batch per field, don''t use ''GO''')
, ('Fields grow as you type')
, ('Use the [+] buttons to add more')
, ('See examples below for advanced usage')
;
GO
影響を受ける4行
--------------------------------------------------------------------------------
-- Or use XML to see the visual representation, thanks to Justin Pealing and
-- his library: https://github.com/JustinPealing/html-query-plan
--------------------------------------------------------------------------------
set statistics xml on;
select d1.* from docs d1
join docs d2 on d2.id=d1.id
join docs d3 on d3.id=d1.id
join docs d4 on d4.id=d1.id;
set statistics xml off;
GO
id | 文書
-:| :----------------------------------------
1 | フィールドごとに1つのバッチを入力し、「GO」は使用しないでください
2 | 入力するとフィールドが大きくなります
3 | [+]ボタンを使用してさらに追加します
4 | 高度な使用法については、以下の例を参照してください

--------------------------------------------------------------------------------
-- Or use XML to see the visual representation, thanks to Justin Pealing and
-- his library: https://github.com/JustinPealing/html-query-plan
--------------------------------------------------------------------------------
set statistics xml on;
select d1.* from docs d1
left join docs d2 on d2.id=d1.id
left join docs d3 on d3.id=d1.id
left join docs d4 on d4.id=d1.id;
set statistics xml off;
GO
id | 文書
-:| :----------------------------------------
1 | フィールドごとに1つのバッチを入力し、「GO」は使用しないでください
2 | 入力するとフィールドが大きくなります
3 | [+]ボタンを使用してさらに追加します
4 | 高度な使用法については、以下の例を参照してください

alter table docs
add foreign key (id) references docs (id) ;
GO
✓
--------------------------------------------------------------------------------
-- Or use XML to see the visual representation, thanks to Justin Pealing and
-- his library: https://github.com/JustinPealing/html-query-plan
--------------------------------------------------------------------------------
set statistics xml on;
select d1.* from docs d1
join docs d2 on d2.id=d1.id
join docs d3 on d3.id=d1.id
join docs d4 on d4.id=d1.id;
set statistics xml off;
GO
id | 文書
-:| :----------------------------------------
1 | フィールドごとに1つのバッチを入力し、「GO」は使用しないでください
2 | 入力するとフィールドが大きくなります
3 | [+]ボタンを使用してさらに追加します
4 | 高度な使用法については、以下の例を参照してください
