Estou fazendo um relatório simples recentemente, a ferramenta usada é o sail soft report, no começo eu me sinto um pouco baixo, agora parece bom, além da interface ser muito feia, mas também outra, essa maneira de usar o sql muito Eu acho que é muito flexível e eficiente, eu gosto.Este processo SQL realmente melhorou bastante.Um dos requisitos é fazer uma ligação de dados, a ligação muda de alguns campos entre os relatórios.
Procura
Duas tabelas, alguns campos da tabela B precisam seguir as alterações da tabela A para obter a cascata, em cascata ou totalmente sincronizada.
Depois de uma onda de análise, pensei em fazer uma operação em cascata, mas, à primeira vista, de fato, a junção pode ser resolvida.
Alcançar
Antes de tudo, devemos considerar que os dados originais da tabela B não podem ser movidos e, em seguida, realizar a ligação .. ou criar uma tabela para explicar todo o princípio.
Preparação de dados
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');
Os dados iniciais são os seguintes:
-- 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)
Detalhes do processo
Primeiro, deixe os dados da tabela B ficarem imóveis quando forem inicializados.
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
A junção esquerda e a junção direita precisam de uso flexível
A tabela B está conectada à esquerda da tabela A como a tabela C
+------+-----+------+------+--------+-------+------+--------+-------+
| 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 |
+------+-----+------+------+--------+-------+------+--------+-------+
Uma tabela e uma tabela C são deixadas conectadas (dados sincronizados, como nova adição)
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)
Insira esta tabela intermediária 01, chave primária na tabela de destino tb_02
Inserção da chave primária: o conflito da chave primária é substituído, caso contrário, é adicionado, ou seja, preenche a chave primária do 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)
Depois de aguardar o envio, você também deve marcar quais estão sincronizados e quais estão offline.
Ou seja: use uma tabela de junção correta da tabela de destino, pode corresponder, é canto sincronizado.
-- 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)
Processo central
É um processo de duas etapas, primeiro conecte-se à esquerda e, em seguida, conecte-se à direita. Você precisa inserir a chave principal duas vezes no meio.
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
Versão simplificada (o formulário B é o mesmo que o formulário A)
Diretamente uma conexão à esquerda (inserção da chave primária) e, em seguida, uma conexão à direita, correspondendo ao ID na linha como um rótulo.
-- 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
Alcançar efeito
Não há nenhum problema com a verificação de adição e modificação, observando principalmente uma onda de operações de exclusão.
Agora, suponha que uma tabela de 102 a ser eliminado, e que o resultado final do mesmo, na Tabela B, status do Estado torna-se esvaziá-la viva, para a lápide efeito, então é melhor capaz de atender a parte de trás de negócios para verificar os dados Necessidade.
Após a exclusão da primeira onda de 102, o efeito de ligação da tabela do meio step_01:
Neste momento, a tabela de destino, uma vez atualizado , esse status é sincronizado Sim.
Sumário
- Ligação de dados Junte-se à conexão esquerda e direita, você pode fazer isso facilmente, é complicado no início, em cascata com chaves primárias e estrangeiras e procedimentos armazenados, gatilhos e outros métodos complexos
- Junte-se a este método "tabela de atualização de chave primária", o preenchimento do valor do campo de tag, a inserção dinâmica de valores, esta operação ainda é muito poderosa
- O SQL é usado com as ferramentas correspondentes, como o Tableau anterior e o atual relatório de navegação, e é cada vez mais constatado que o SQL é realmente perfumado.