私は最近シンプルなレポートを行っています、使用されているツールは帆のソフトレポートです。最初は少し低く感じましたが、今では大丈夫です。インターフェイスが本当に醜いだけでなく、他にも、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は本当に香りがよいことがますます見つかります。