Join realiza 2 tabelas de ligação de dados

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.

Acho que você gosta

Origin www.cnblogs.com/chenjieyouge/p/12735164.html
Recomendado
Clasificación