SQL 表結合(join) - 単純結合、等価結合、非等価結合、外部結合、再帰結合(SQL表连接-简单连接,等价连接,非等价连接,外部连接,回归连接)
様々な連結テーブルが作成できるが、良く使うものはビュー(create view) に しておくと効率が良い。各种各样的连接表中,有的对视图也起作用。
結合は、テーブルとテーブル、ビューとビュー、テーブ ルとビューなど複雑にできる。(テーブル連結)连接可以在数据表和数据表之间,视图和视图之间,数据表和视图之间复杂的进行。
■単純結合 简单连接 ・現実的に単純結合を使う機会はないだろう。实际上简单结合没有什么使用的机会。
次の例では、受注m の各レコードに 品番m の全レコードが結合される。
在下面的例子中,在受注m的各种记录里,品番m的所有记录都被结合了。
受注m のレコード数 x 品番m のレコード数の結果が問い合わされる。
受注m的记录数*品番m的记录数的结果被查询出来。 select * from sak.受注m, sak.品番m; ■等価結合 等价连接 ・等価結合は、特定のキーで表を結合します。等价连接是用特定的键来进行表的结合的。
条件のどちらかのデータが存在しない場合、結果セットには含まれません。
如果有条件在数据表里不存在,在结果集里就没有这一条记录。
現実的には外部結合が一番使いやすいと思います。在实际上,外部结合是最容易使用的。
select 受注番号, 受注m.品番 品番, 品番m.入庫数 入庫数 from sak.受注m, sak.品番m where 受注m.品番 = 品番m.品番 ; ・列の別名定義は、as を指定してもよい。列的别名指定,也可以用as来实现。
結合テーブルに同じ項目名が存在する場合は、どちらのテーブル項目か指定するため、テーブル名で修飾する。(受注m.品番)
在连接表中如果有相同的项目名存在,为了让每一个项目都被指定,就用项目名来修饰。
select 受注番号, 受注m.品番 as 品番, 品番m.入庫数 as 入庫数 from sak.受注m, sak.品番m where 受注m.品番 = 品番m.品番; ・inner join を使用して、等価結合することもできます。(インナージョイン)
使用inner join,也可以进行等价连接。
select 受注番号, 受注m.品番 as 品番, 品番m.入庫数 as 入庫数 from sak.受注m inner join sak.品番m on 受注m.品番 = 品番m.品番; ・3 つ以上の結合を inner join で指定するには、次のようにする。
如果有三个以上要指定inner join 来进行连接的时候,可以像下面这样做。
select * from (sak.受注m inner join sak.品番m on 受注m.品番 = 品番m.品番) inner join sak.得意先m on 受注m.得意先CD = 得意先m.得意先CD; ■非等価結合 非等价连接 ・非常に時間のかかる結合ですが、必要な場面があるかもしれない。虽然很花时间,但有时候也要进行下面的检索。
なにがしかの範囲条件で結合する場合に使います。和检索条件的一部分进行连接。
select 受注番号, 受注m.品番 品番, 品番m.入庫数 入庫数 from sak.受注m, sak.品番m where 受注m.機種 like substr(品番m.機種, 1, 2);
■外部結合 外結合、行結合、行連結、テーブル結合、外部接合
外部连接 外连接,行连接,表连接,外部连接
・外部結合は、一番よく使用します。外部连接是最经常使用的。
一方の条件に対するデータが存在しなかった場合でも片方のデータを結果セ ットに含める指定ができます。
对于一方的条件即使不存在,也可以使结果集包含一边的数据。
次の例では、品番m にない品番の受注m レコードも結果に含まれます。
在下面的例子中,在品番m中没有的品番受注m记录的结果也包含了进来。
この場合、入庫数などの 品番m 項目には NULL がセットされて問い合わさ れます。Oracle では、left join、right join を (+) で指定できます。
这时候,入库数等的品番m项目里被设定了NULL值。在oracle里,left join,right join 可以用(+)来指定。
(左結合、右結合、複数テーブル問い合わせ、複数テーブル参照) (複数問い合わせ、複合テーブル参照、レフトジョイン、ライトジョイン)
(左连接,右连接,多个表查询,多个表参照,左连接,右连接)
select 受注番号, 受注m.品番 品番, 品番m.入庫数 入庫数 from sak.受注m, sak.品番m where 受注m.品番 = 品番m.品番 (+); select 受注番号, 受注m.品番 品番, 品番m.入庫数 入庫数 from sak.受注m left join sak.品番m on 受注m.品番 = 品番m.品番; ・逆に受注m にない品番の品番m レコードを結果に含ませることもできます。 現実的には、こういう結合に意味はありませんが、逆の和もできると言うこ とです。
・相反不在受注m里的品番m记录也可以在结果里包含。在实际中,虽然没有这么用的,但是(+)也可以放在=之前。
select 受注番号, 受注m.品番 品番, 品番m.入庫数 入庫数 from sak.受注m, sak.品番m where 受注m.品番 (+) = 品番m.品番; select 受注番号, 受注m.品番 品番, 品番m.入庫数 入庫数 from sak.受注m right join sak.品番m on 受注m.品番 = 品番m.品番; ・三つ以上の表を結合することもできます。(3 テーブル結合)
・也可以进行三个表以上的表连接。(三表连接)
次の例では、品番に対する品番m.入庫数、得意先CD に対する得意先m.得意 先名を結合しています。(left join を使用しても良い。)
在下面的例子中,对于品番的品番m.入库数,对于得意先CD的得意先m.得意先名来进行连接。(也可以使用左连接)
select 受注番号, 受注m.品番 品番, 品番m.入庫数 入庫数, 受注m.得意先CD 得意先CD, 得意先m.得意先名 得意先 from sak.受注m, sak.品番m, sak.得意先m where 受注m.品番 = 品番m.品番 (+) and 受注m.得意先CD = 得意先m.得意先CD (+); select 受注番号, 受注m.品番 品番, 品番m.入庫数 入庫数, 受注m.得意先CD 得意先CD, 得意先m.得意先名 得意先 from (sak.受注m left join sak.品番m on 受注m.品番 = 品番m.品番) left join sak.得意先m on 受注m.得意先CD = 得意先m.得意先CD; ・複数の表を結合すると修飾が難解になりがちなので、テーブル別名を使うと 良いです。
如果多个表进行连接,修饰会变得很复杂,也可以使用表别名。
select 受注番号, a.品番 品番, b.入庫数 入庫数, a.得意先CD 得意先CD, c.得意先名 得意先 from sak.受注m a, sak.品番m b, sak.得意先m c where a.品番 = b.品番 (+) and a.得意先CD = c.得意先CD (+); ** 外部結合を明示するために left join を left outer join、right join を right outer join と書くこともできる。
** 为了明确外部连接,也可以把left join 写成 left outer join, right join写成right outer join。
(アウタージョイン、レフトアウタージョイン、ライトアウタージョイン)
(outer join, left outer join, right outer join)
■再帰結合(内部結合) 回归连接(内部结合) ・再帰結合は、同じテーブルをテーブル別名を使用して結合します。
・回归连接是相同的表来用别名来进行连接的。
次の例では、得意先m に親得意先CD があるとして、その得意先名を自分自 身と結合しています。(自己結合)
在下面的例子中,以得意先作为父得意先,然后用这个名字来进行自身连接。
select a.得意先CD 得意先CD, a.得意先名 得意先, a.親得意先CD 親得意先CD, b.得意先名 得意先 from sak.得意先m a, sak.得意先m b where a.得意先CD = b.親得意先CD (+);