MYSQL:将非 NULL 值从一个表复制到另一个表,WHERE 行根据列值进行匹配

问题描述 投票:0回答:1

我几乎从不使用 MYSQL,但在一个小项目中不得不使用它。

我有两个相同的表,都存储不同的数据。 我希望能够将数据添加到表 A,然后如果表 B 中存在与列值匹配的数据,则复制表 A 中可能存在的任何值,然后从表 B 中删除该条目。

示例 表B

姓名 年龄 高度 重量
鲍勃 2 10 10
蒂姆 20 20

表A

姓名 年龄 高度 重量

插入表A TIM、4、10、空

表A

姓名 年龄 高度 重量
蒂姆 4 10

然后应该检查表 B 中是否有与我们刚刚使用的名称匹配的任何条目,并使用任何丢失/错误的数据更新表 A,以便表 A 最终看起来像这样。

表A

姓名 年龄 高度 重量
蒂姆 4 20 20

最后从表 B 中删除该条目

表B

姓名 年龄 高度 重量
鲍勃 2 10 10

最后表 A 应该具有完整更新的记录,表 B 应该具有尚未与表 A 中的某些内容关联的任何内容

我将其编写为存储过程,所以我尝试做这样的事情:

`INSERT INTO tableA (NAME, AGE, HEIGHT, WEIGHT) VALUES ( NAME_IN, AGE_IN, HEIGHT_IN, WEIGHT_IN);

SELECT * INTO @Aentry FROM tableA WHERE NAME = NAME_IN;

IF EXISTS ( SELECT * INTO @Bentry FROM tableB WHERE NAME = @Aentry.NAME)
THEN
UPDATE tableA SET
  NAME =IFNULL(@Bentry.NAME, NAME),
  AGE =IFNULL(@Bentry.AGE, AGE),
  HEIGHT =IFNULL(@Bentry.HEIGHT, HEIGHT),
  WEIGHT=IFNULL(@Bentry.WEIGHT, WEIGHT)
WHERE NAME = @Bentry.NAME;

DELETE FROM tableB WHERE NAME = @Aentry.NAME;
END IF;`

但是由于 SELECT * 这似乎不起作用。

sql mysql database stored-procedures
1个回答
0
投票
--  S a m p l e    D a t a :
/*   WITH TABLE_B
NAME    AGE HEIGHT  WEIGHT
------ ---- ------ ------- 
BOB       2     10      10
TIM    null     20      20    */

/*   WITH TABLE_A
NAME    AGE HEIGHT  WEIGHT
------ ---- ------ ------- 
TIM       4     10    null    */
UPDATE TABLE_A a
INNER JOIN TABLE_B b ON(b.NAME = a.NAME)
SET a.AGE = Case When Coalesce(a.AGE, 0) != b.AGE Then b.AGE Else a.AGE End,
    a.HEIGHT = Case When Coalesce(a.HEIGHT, 0) != b.HEIGHT Then b.HEIGHT Else a.HEIGHT End,
    a.WEIGHT = Case When Coalesce(a.WEIGHT, 0) != b.WEIGHT Then b.WEIGHT Else a.WEIGHT End;
/*    TABLE_A - after update
NAME    AGE HEIGHT  WEIGHT
------ ---- ------ ------- 
TIM       4     20      20    */
DELETE FROM TABLE_B b
WHERE EXISTS (Select 1 From TABLE_A a
              Where a.NAME = b.NAME And 
                    a.AGE Is Not Null And 
                    a.HEIGHT Is Not Null And 
                    a.WEIGHT Is Not Null);
/*    TABLE_B - after delete
NAME    AGE HEIGHT  WEIGHT
------ ---- ------ ------- 
BOB       2     10      10   */
© www.soinside.com 2019 - 2024. All rights reserved.