我正在从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
以上各种各样的东西。
答案 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;
<强>输出:强>
在这里演示:
延迟编辑:
看到@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
的第一部分,每个子记录只有一个匹配的父记录,查询就会起作用。
答案 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