先週、sybase12が完全外部結合をサポートしていないことに驚きました。しかし、完全外部結合は、同じSQLの右外部結合と結合された左外部結合と同じである必要があることに気付きました。これが当てはまらない理由を誰かが考えることができますか?
4 に答える
UNION ALL
ただし、右結合はベース テーブルに存在しない行のみに制限します (存在する場合にテーブルで null にならない場合は、結合で null を返します)。
このコードでは、2 つのテーブル t1 と t2 を作成する必要があります。t1 には、値 1 ~ 5 を含む 5 つの行を持つ c1 という名前の 1 つの列が必要です。t2 には、値 2 ~ 6 を含む 5 つの行を持つ c1 列も必要です。
完全外部結合:
select * from t1 full outer join t2 on t1.c1=t2.c1 order by 1, 2;
同等の完全外部結合:
select t1.c1, t2.c1 from t1 left join t2 on t1.c1=t2.c1
union all
select t1.c1, t2.c1 from t1 right join t2 on t1.c1=t2.c1
where t1.c1 is null
order by 1, 2;
結果を重複しないものだけに制限する右側の結合選択の where 句に注意してください。
UNION
OUTER JOIN
2 つのステートメントを-ing すると、 INNER JOIN
. SELECT DISTINCT
によって生成されたデータ セットに対して、おそらく を実行する必要がありUNION
ます。一般に、 a を使用する必要がある場合、SELECT DISTINCT
それは適切に設計されたクエリではないことを意味します (または、私が聞いたことがあります)。
それらをUNION ALL
で結合すると、重複が発生します。UNION
なしで使用ALL
すると、重複がフィルタリングされるため、完全結合と同等になりますが、個別の並べ替えを実行する必要があるため、クエリのコストも大幅に高くなります。
まず、なぜ 12.x を使用しているのかわかりません。2007 年 4 月 3 日に通知された後、2009 年 12 月 31 日にEndOfLife でした。15.0.2 (最初のソリッド バージョン) は 2009 年 1 月にリリースされました。少なくとも 13 か月以上、期限切れです。
ASE 12.5.4 には新しい Join 構文があります。(指定していません。それより前のリリースである 12.5.0.3 を使用している可能性があります)。
DB2とSybaseは
FULL OUTER JOIN
、あなたが特定した正確な理由で、実装しLEFT ... UNION ... RIGHT
ませんでしたALL
。FOJ を「サポートしない」ということではありません。キーワードが抜けている場合です。そして、データベースがより正規化される傾向があるなどの理由で、Sybase と DB2 の型は一般に FOJ はもちろん外部結合を使用しないという問題があります。
最後に、FOJ の機能を提供し、12.x で明らかに高速になる、Sybase のどのバージョンでも使用できる完全に普通の SQL があります。15.x ではわずかに高速です。これは RANK() 関数のようなものです。サブクエリを記述できる場合はまったく不要です。
FULL OUTER
一部のローエンド エンジンが必要とする . すなわち。1 回のパスで LEFT と RIGHT を実行します。SARGやDataTypeの不一致などによっては、ソートマージが必要になる場合がありますが、それも3つのレベルすべてでストリーミングされます。ディスクI/Oサブシステム。エンジン; およびネットワークハンドラー。テーブルがパーティション化されている場合、そのレベルでさらに並列化されます。
サーバーが構成されておらず、結果セットが非常に大きい場合は、 と を増やす必要がある場合があり
proc cache size
ますnumber of sort buffers
。それで全部です。