在MySQL中为子行选择父行单元格值

时间:2017-03-17 08:23:48

标签: mysql sql

我正在从Excel工作表导入数据,而我正处于一个包含父行和子行的表的位置。子行与父行具有相同的列,除了子行在列A中为空,这是父行的主键和子行的外键。

示例数据

 - AI ID | Employee Number | Employee Name
 - 1     | 33400           | John
 - 2     | NULL            | John's Wife
 - 3     | NULL            | John's Child
 - 4     | 43443           | Susan
 - 5     | NULL            | Susan's Husband

如何使用其父行的值填充行2,3,4,000个具有NULL的员工编号。

因此,员工编号栏就像这样

 - 33400
 - 33400
 - 33400
 - 43443
 - 43443

注意:更新 这是一个真实世界的场景,因此不需要父行的字段来识别它的子行。不幸的是,上表暗示employee name正在这样做。

确定子父行依赖性的实际AI ID列。当所有行按employer number NOT NULL排序时,每个子行都属于AI ID上面的第一行。理想情况下,我正在查看执行以下操作的查询:

IF Employee_Number IS NULL
SELECT Employee_Number OF FIRST ROW
WHERE Employee_Number IS NOT NULL AND ROW_ABOVE.AI_ID < CURRENT_ROW.AI_ID

以上各种各样的东西。

4 个答案:

答案 0 :(得分:2)

SELECT t1.`AI ID`,
       t2.`Employee Number`,
       t1.`Employee Name`
FROM yourTable t1
INNER JOIN yourTable t2
    ON t1.`Employee Name` LIKE CONCAT('%', t2.`Employee Name`, '%')
WHERE t2.`Employee Number` IS NOT NULL;

<强>输出:

enter image description here

在这里演示:

Rextester

延迟编辑:

看到@Giorgos的答案让我想知道你是否想要更新你的桌子。如果是这样,我的查询可以稍微修改为:

UPDATE yourTable t1
INNER JOIN yourTable t2
    ON t1.`Employee Name` LIKE CONCAT('%', t2.`Employee Name`, '%')
SET t1.`Employee Number` = t2.`Employee Number`
WHERE t2.`Employee Number` IS NOT NULL;

答案 1 :(得分:1)

您可以使用如下查询:

UPDATE Table1 AS t1
JOIN Table1 AS t2 ON t1.EmployeeName LIKE CONCAT(t2.EmployeeName, '%')
SET t1.EmployeeNumber = t2.EmployeeNumber
WHERE t1.EmployeeNumber IS NULL

只要基于EmployeeName的第一部分,每个子记录只有一个匹配的父记录,查询就会起作用。

Demo here

答案 2 :(得分:0)

我建议您在执行此表更新之前执行更多研究。通常情况下,我们可以拥有相同名称的员工。在这种情况下,您最终会更新NULL员工编号错误Employee Number的记录。

在您的研究之后,编写一个包含少量sql语句的脚本来实现此目的,而不是触发单个更新。不要错过备份你的桌子。

答案 3 :(得分:0)

在此演示:http://rextester.com/FDJYO55558

已完成以下操作,但我并不暗示它以任何方式有效(资源方面),因为它使用子查询。因此,对于我一次性进口的目的,这只是实现我想要的东西的骨干。如果能够采取更有效的方式,我就更愿意学习!

CREATE TABLE yourTable (`AI_ID` int, `Employee_Number` int, `Employee_Name` varchar(255));
INSERT INTO yourTable (`AI_ID`, `Employee_Number`, `Employee_Name`)
VALUES
(1, 33400, 'John'),
(2, NULL,  'John''s Wife'),
(3, NULL,  'John''s Child'),
(4, 43443, 'Susan'),
(5, NULL,  'Susan''s Husband');

SELECT *, 
(SELECT Employee_Number FROM yourTable innerTable 
    WHERE innerTable.AI_ID <= outerTable.AI_ID
    AND innerTable.Employee_Number IS NOT NULL
    ORDER BY innerTable.AI_ID DESC
    LIMIT 1) AS Parent_Employee_Number FROM yourTable outerTable