「CROSS JOIN [table] 」と「INNER JOIN [table] ON 1=1」の違いって?

f:id:ts0818:20211127215625j:plain

www.itmedia.co.jp

 金融庁は11月26日、みずほ銀行みずほフィナンシャルグループ(みずほFG)が2月から9月にかけて計8回の障害を起こした件について業務改善命令を出した。短期間に複数のシステム障害を発生させ「日本の決済システムに対する信頼感を損ねた」(金融庁)としている。

金融庁、みずほ銀行に行政処分 「リスク、IT現場を軽視」「言われたことしかしない」「信頼感損ねた」 - ITmedia NEWS

 障害を連発する直接の原因について金融庁は、みずほ銀行などにおいて「開発や障害対応時について検証が不足している」「保守運用に関する問題を是正していない」「保守管理体制を整備できていない」「危機対応にかかる訓練が不十分」などと指摘した。

金融庁、みずほ銀行に行政処分 「リスク、IT現場を軽視」「言われたことしかしない」「信頼感損ねた」 - ITmedia NEWS

 背景には「執行部門がIT現場の実態を十分把握せず、基幹システム『MINORI』が安定稼働していると誤認していた」「MINORIを過信し、安定稼働に必要な事項を確認しないまま運用を始めた」「保守運用に必要な人員や経費を削減し体制を弱体化させた」などの要素があったと評価した。

金融庁、みずほ銀行に行政処分 「リスク、IT現場を軽視」「言われたことしかしない」「信頼感損ねた」 - ITmedia NEWS

 これらを踏まえ金融庁は、みずほ銀行とみずほFGが抱えていたガバナンス上の問題点は(1)システムに関するリスクと専門性の軽視(2)IT現場の実態軽視(3)顧客への影響に対する感度の欠如と営業現場の実態軽視(4)言うべきことを言わず、言われたことしかしない姿勢の4点だと評価。これらは同行が02年、11年に起こした障害にも通ずる問題であり、過去の教訓を踏まえた取り組みが継続されていない部分や、環境変化に対応できていない部分があるとした。

金融庁、みずほ銀行に行政処分 「リスク、IT現場を軽視」「言われたことしかしない」「信頼感損ねた」 - ITmedia NEWS

⇧ このあたりが、「民間」と「お役所」の壁というところですかね、「ありのままの姿」見せれるのは、「アナと雪の女王」ぐらいだというところでしょうかね。

「言いたいことも言えない こんな世の中じゃ Poison(『POISON〜言いたい事も言えないこんな世の中は〜』作詞:反町隆史)」ってわけにはいかないでしょうね。

そもそもとして、「金融庁」側と「みずほ銀行」側で、どういう対話がなされてるのかが見えないので、「金融庁」側の上げた一方的な「問題点」が的を得ているのかは不明ということですかね...

そんなこんなで、「SQL」の「JOIN」まわりについて調べてみました。

レッツトライ~。

そも、JOINとは?

Wikipediaさんに聞いてみた。

join clause in SQL – corresponding to a join operation in relational algebra – combines columns from one or more tables into a new table. ANSI-standard SQL specifies five types of JOININNERLEFT OUTERRIGHT OUTERFULL OUTER and CROSS.

https://en.wikipedia.org/wiki/Join_(SQL)

⇧ とあって、「SQL」においては、1つまたはそれ以上の「テーブル」を結合して新たな「テーブル」にするってことですと。

「標準SQL」としては、

  • INNER JOIN
  • LEFT OUTER JOIN
  • RIGHT OUTER JOIN
  • FULL OUTER JOIN
  • CROSS JOIN

の5つを定義してるらしい。

ただ、「データベース」を提供してるベンダーなんかによって、対応してたり対応して無かったり、微妙に差異があるらしい。

あと、「INNER JOIN」を「JOIN」と言ったり、「LEFT OUTER JOIN」を「LEFT JOIN」と言ったり、このあたりはファジーな感じでしょうか。

■LEFT OUTER JOIN

f:id:ts0818:20211127191551p:plain

A Venn Diagram representing the Left Join SQL statement between tables A and B.

https://en.wikipedia.org/wiki/Join_(SQL)

■RIGHT OUTER JOIN

f:id:ts0818:20211127191702p:plain

A Venn Diagram representing the Right Join SQL statement between tables A and B.

https://en.wikipedia.org/wiki/Join_(SQL)

■FULL OUTER JOIN

f:id:ts0818:20211127191750p:plain

A Venn Diagram representing the Full Join SQL statement between tables A and B.

https://en.wikipedia.org/wiki/Join_(SQL)

⇧ ってな感じで、「INNER JOIN」と「CROSS JOIN」以外は、「ベン図」を載せてくれてるんだけど、

medium.com

⇧ 上記サイト様によりますと、

  1. INNER JOIN
  2. LEFT OUTER JOIN
    • Left-Semi-Join
  3. RIGHT OUTER JOIN
    • Right-Semi-Join
  4. FULL OUTER JOIN
  5. CROSS JOIN

を表現できるらしい。

ただ、「T-SQLTransact-SQL)」だと、

stevestedman.com

The diagram shows the following: INNER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN, SEMI JOIN, ANTI SEMI JOIN, LEFT OUTER JOIN with exclusion, RIGHT OUTER JOIN with exclusion, FULL OUTER JOIN, CROSS JOIN, FULL OUTER JOIN with exclusion, CROSS APPLY, OUTER APPLY, two INNER JOINs, two FULL OUTER JOINs, INNER JOIN and a LEFT OUTER JOIN, two LEFT OUTER JOINs, INTERSECT, UNION, and EXCEPT.

https://stevestedman.com/2015/05/tsql-join-types-poster-version-4-1/

⇧ って言ってて、「標準SQL」を拡張した書き方ができちゃうみたい...

まぁ、実際、どういう挙動なのかは、

cloud.google.com

Googleさんの「BigQuery」のドキュメントの説明がイメージしやすいかと。

 

「CROSS JOIN [table] 」と「INNER JOIN [table] ON 1=1」の違いって?

はい、そして、本日のお題に参りましょう。

「CROSS JOIN [table] 」と「INNER JOIN [table] ON 1=1」に違いって?

The cross join can be replaced with an inner join with an always-true condition:

SELECT *
FROM employee INNER JOIN department ON 1=1;

CROSS JOIN does not itself apply any predicate to filter rows from the joined table. The results of a CROSS JOIN can be filtered using a WHERE clause, which may then produce the equivalent of an inner join.

In the SQL:2011 standard, cross joins are part of the optional F401, "Extended joined table", package.

Normal uses are for checking the server's performance.

https://en.wikipedia.org/wiki/Join_(SQL)

⇧ まさかの、同じという見解が...

ただ、

stackoverflow.com

One thing to note is a cross join will result in an empty table if one of the tables is empty. If one of your tables might be empty and you still want records, you may want an outer join (e.g. left, right, or full) on 1=1.

https://stackoverflow.com/questions/21029815/join-on-1-1-versus-cross-join

⇧「CROSS JOIN」は、片方の「テーブル」が空の場合に、上手くいかないことがあるらしい。

少なくとも、

stackoverflow.com

SQL Serverだと、「LEFT JOIN [table] ON 1 = 1」とか「FULL OUTER JOIN」とかで対応できるって話を言ってますね。

なので、他の「RDBMS(Relational Database Management System)」に当てはまるかは分からないですが、「外部キー」がない「テーブル」を結合しようとした時には、「CROSS JOIN」が使えない時がありますと。

だけど、それは、「INNER JOIN [table] ON 1 = 1」も変わらないと思うけど、「LEFT JOIN [table] ON 1 = 1」とかであればカバーできる時もありますと。

「INNER JOIN [table] ON 1 = 1」は、片方の「テーブル」が1件しかデータを持ってない、且つ、「外部キー」が存在しないような時に使い道があるんかな?

ちなみに、PostgreSQLで、

■learning.blog

レコード

f:id:ts0818:20211127203636p:plain

テーブル構造

f:id:ts0818:20211127205349p:plain

制約

f:id:ts0818:20211127205245p:plain

■learning.user

レコード

f:id:ts0818:20211127203700p:plain

テーブル構造

f:id:ts0818:20211127205447p:plain

制約

f:id:ts0818:20211127205147p:plain

ってテーブルに、上記のレコードを用意して、PostgreSQLにログインして以下のSQLを実行してみると、

SELECT * FROM learning.blog bg INNER JOIN learning.user ur ON 1 = 1 WHERE bg.id = 1;

f:id:ts0818:20211127204454p:plain

⇧「WHERE句」で条件を絞れば、全てのレコード数の「直積」は避けられる模様。

試しに、両方の「主キー」のidが「1」という条件を付けてみると、

SELECT * FROM learning.blog bg INNER JOIN learning.user ur ON 1 = 1 WHERE bg.id = 1 AND ur.id = 1;

f:id:ts0818:20211127204912p:plain

⇧ 1件のみ取得となりましたね。

「テーブル」の設計って激難な感じですね...

今回もモヤモヤ感が半端ない...

今回はこのへんで。