結合は2つのテーブルのデータリンケージを実現します

私は最近シンプルなレポートを行っています、使用されているツールは帆のソフトレポートです。最初は少し低く感じましたが、今では大丈夫です。インターフェイスが本当に醜いだけでなく、他にも、SQLをこのように使用する方法がたくさんあります。このプロセスSQLは確かに大幅に改善されました。要件の1つは、データリンケージ、つまりレポート間のいくつかのフィールドのリンケージ変更を行うことです。

需要

2つのテーブル、つまりテーブルBの一部のフィールドは、テーブルAの変更に従って、カスケード、または完全に同期されたカスケードを実現する必要があります。

分析の波の後、私はカスケード操作を実行したいと思いましたが、一見すると、実際には結合が解決できます。

達成する

まず最初に、テーブルBの元のデータは移動できないことを考慮してから、リンケージを実行するか、全体の原理を説明するテーブルを作成します。

データの準備

drop table if exists tb_01;
create table tb_01(
	id varchar(20) primary key,
	name varchar(20),
	age int,
	gender varchar(30),

	-- 默认值
	alive varchar(30) not null default 'alive'
);


insert into tb_01(id, name, age, gender) values ('100', 'youge', 24, '男');
insert into tb_01(id, name, age, gender) values ('101', 'xiaojie', 22, '女');
insert into tb_01(id, name, age, gender) values ('102', 'tianer', 22, '女');



drop table if exists tb_02;
create table tb_02(
	id varchar(20) primary key,

	name varchar(20),
	age int,
	gender varchar(30),

	dream varchar(20),
	city varchar(20),
	income int,

	-- alive 有值表示同步中, 无值则表示离线状态
	status varchar(20) null
); 


insert into tb_02(id) values ('100');
insert into tb_02(id) values ('101');
insert into tb_02(id) values ('102');
insert into tb_02(id) values ('103');

初期データは次のとおりです。

-- preview

mysql> select * from tb_01;
+-----+---------+------+--------+
| id  | name    | age  | gender |
+-----+---------+------+--------+
| 100 | youge   |   24 | 男     |
| 101 | xiaojie |   22 | 女     |
| 102 | tianer  |   22 | 女     |
+-----+---------+------+--------+
3 rows in set (0.00 sec)

mysql> select * from tb_02;
+-----+------+------+--------+-------+------+--------+-------+
| id  | name | age  | gender | dream | city | income | alive |
+-----+------+------+--------+-------+------+--------+-------+
| 100 | NULL | NULL | NULL   | NULL  | NULL |   NULL | NULL  |
| 101 | NULL | NULL | NULL   | NULL  | NULL |   NULL | NULL  |
| 102 | NULL | NULL | NULL   | NULL  | NULL |   NULL | NULL  |
| 103 | NULL | NULL | NULL   | NULL  | NULL |   NULL | NULL  |
+-----+------+------+--------+-------+------+--------+-------+
4 rows in set (0.00 sec)

プロセスの詳細

まず、初期化時にテーブルBのデータを移動できないようにします。

select
  a.id as a_id,

  b.id,
  b.name,
  b.age,
  b.gender,
  b.dream,
  b.city,
  b.income,
  b.alive

from tb_01 as a 
right join tb_02 as b
  on a.id = b.id

左結合と右結合には柔軟な使用が必要

Bテーブルは、CテーブルとしてAテーブルの左側に接続されています

+------+-----+------+------+--------+-------+------+--------+-------+
| a_id | id  | name | age  | gender | dream | city | income | alive |
+------+-----+------+------+--------+-------+------+--------+-------+
| 100  | 100 | NULL | NULL | NULL   | NULL  | NULL |   NULL | NULL  |
| 101  | 101 | NULL | NULL | NULL   | NULL  | NULL |   NULL | NULL  |
| 102  | 102 | NULL | NULL | NULL   | NULL  | NULL |   NULL | NULL  |
| NULL | 103 | NULL | NULL | NULL   | NULL  | NULL |   NULL | NULL  |
+------+-----+------+------+--------+-------+------+--------+-------+

テーブルとCテーブルは接続されたままです(新規追加などの同期データ)

select 
  a.id,
  a.name,
  a.age,
  a.gender,

  -- c.a_id,
  c.dream,
  c.city,
  c.income,
  c.alive

from tb_01 as a
left join (

	select
	  a.id as a_id,

	  b.id,
	  b.name,
	  b.age,
	  b.gender,
	  b.dream,
	  b.city,
	  b.income,
	  b.alive

	from tb_01 as a 
	right join tb_02 as b
	  on a.id = b.id 

	) as c

  on a.id = c.id

-- A 表删减记录, 不会影响 B 表原有的
 and c.a_id is not null  

-- 左边作为作为联动标准(中间表01)
+-----+---------+------+--------+-------+------+--------+-------+
| id  | name    | age  | gender | dream | city | income | alive |
+-----+---------+------+--------+-------+------+--------+-------+
| 100 | youge   |   24 | 男     | NULL  | NULL |   NULL | NULL  |
| 101 | xiaojie |   22 | 女     | NULL  | NULL |   NULL | NULL  |
| 102 | tianer  |   22 | 女     | NULL  | NULL |   NULL | NULL  |
+-----+---------+------+--------+-------+------+--------+-------+
3 rows in set (0.00 sec)

この中間テーブル01、主キーをターゲットテーブルtb_02に挿入します。

主キーの挿入:主キーの競合は上書きされます。それ以外の場合は追加されます。つまり、Sailsoftの主キーを入力します。

mysql> select * from tb_02;
+-----+---------+------+--------+-------+------+--------+-------+
| id  | name    | age  | gender | dream | city | income | alive |
+-----+---------+------+--------+-------+------+--------+-------+
| 100 | youge   |   24 | 男     | NULL  | NULL |   NULL | NULL  |
| 101 | xiaojie |   22 | 女     | NULL  | NULL |   NULL | NULL  |
| 102 | tianer  |   22 | 女     | NULL  | NULL |   NULL | NULL  |
| 103 | NULL    | NULL | NULL   | NULL  | NULL |   NULL | NULL  |
+-----+---------+------+--------+-------+------+--------+-------+
4 rows in set (0.00 sec)

送信を待った後、同期されているものとオフラインになっているものもマークアウトする必要があります。

つまり、テーブルの右結合ターゲットテーブルを使用し、一致させることができます。同期されたチャントです。

-- step_02 (木丁就是 给 alive 字段打上标签)

select 
  b.id,
  b.name,
  b.age,
  b.gender,
  b.dream,
  b.city,
  b.income,

  -- 匹配上的 将 alive 填充为 该记录的ID
  a.id as alive

from tb_01 as a 
right join tb_02 as b 
  on a.id = b.id 

+-----+---------+------+--------+-------+------+--------+-------+-------+
| id  | name    | age  | gender | dream | city | income | alive | alive |
+-----+---------+------+--------+-------+------+--------+-------+-------+
| 100 | youge   |   24 | 男     | NULL  | NULL |   NULL | NULL  | 100   |
| 101 | xiaojie |   22 | 女     | NULL  | NULL |   NULL | NULL  | 101   |
| 102 | tianer  |   22 | 女     | NULL  | NULL |   NULL | NULL  | 102   |
| 103 | NULL    | NULL | NULL   | NULL  | NULL |   NULL | NULL  | NULL  |
+-----+---------+------+--------+-------+------+--------+-------+-------+
4 rows in set (0.00 sec)


=> 再  提交一波 (主键插入) 则是最新的了。 

mysql> select * from tb_02;
+-----+---------+------+--------+-------+------+--------+-------+
| id  | name    | age  | gender | dream | city | income | alive |
+-----+---------+------+--------+-------+------+--------+-------+
| 100 | youge   |   24 | 男     | NULL  | NULL |   NULL | NULL  |
| 101 | xiaojie |   22 | 女     | NULL  | NULL |   NULL | NULL  |
| 102 | tianer  |   22 | 女     | NULL  | NULL |   NULL | NULL  |
| 103 | NULL    | NULL | NULL   | NULL  | NULL |   NULL | NULL  |
+-----+---------+------+--------+-------+------+--------+-------+
4 rows in set (0.00 sec)

コアプロセス

これは2段階のプロセスであり、最初に左に接続してから、右に接続します。主キーを中央に2回挿入する必要があります。これを見ると、SQLはたくさんありますが、実際には主にフィールドにあり、ロジックは非常に明確です。

select 
  a.id,
  a.name,
  a.age,
  a.gender,

  -- c.a_id,
  c.dream,
  c.city,
  c.income,
  c.alive

from tb_01 as a
left join (

	select
	  a.id as a_id,

	  b.id,
	  b.name,
	  b.age,
	  b.gender,
	  b.dream,
	  b.city,
	  b.income,
	  b.alive

	from tb_01 as a 
	-- 共有的
	left join  tb_02 as b
	  on a.id = b.id 

	) as c

  on a.id = c.id

 and c.a_id is not null

提交一波哦 !!!

-- step_02 (木丁就是 给 alive 字段打上标签)
select 
  b.id,
  b.name,
  b.age,
  b.gender,
  b.dream,
  b.city,
  b.income,

  -- 匹配上的 将 alive 填充为 该记录的ID
  a.id as alive

from tb_01 as a 
right join tb_02 as b 
  on a.id = b.id 

簡略版(フォームBはフォームAと同じ)

直接左接続(主キー挿入)、次に右接続。行のIDをラベルとして照合します。

-- step_01:
select 
  a.*,
  b.dream,
  b.city,
  b.income,
  b.status

from tb_01 as a
left join tb_02 as b
  on a.id = b.id
-- step_02:
-- A 表 跟 目标表 右连接, 能匹配上, 就将 
-- A表的 id 填到 B 的 alive 字段中.
select 
  b.id,
  b.name,
  b.age,
  b.gender,
  b.dream,
  b.city,
  b.income,
  b.city,
  -- A 表的 id (匹配上)
  a.alive as status

from tb_01 as a
right join tb_02 as b 
  on a.id = b.id

効果を達成する

追加・変更チェックは問題なく、主に削除操作の波に目を向けています。

さて、削除するテーブル102を想定し、その最終的な結果という、表Bに、状態のステータスがに、生きている、それを空になった墓石の効果、とても良くできたデータを確認するためにビジネスバックを満たすために必要。

102の最初のウェーブが削除された後、中央のテーブルstep_01のリンク効果:

このとき、ターゲット表は、一度にリフレッシュ、この状態がうん同期されます。

まとめ

  • データリンケージ左と右の接続を結合すると、簡単にそれを実行できます。最初は複雑で、主キーと外部キー、およびストアドプロシージャ、トリガー、その他の複雑なメソッドとカスケードします。
  • この「主キー更新テーブル」メソッドと結合して、タグフィールド値のバックフィル、値の動的挿入を実現できます。この操作は依然として非常に強力です
  • SQLは、以前のTableauや現在のセールソフトレポートなどの対応するツールと共に使用され、SQLは本当に香りがよいことがますます見つかります。

おすすめ

転載: www.cnblogs.com/chenjieyouge/p/12735164.html
おすすめ