2017-03-17 52 views
3

我正在從Excel工作表導入數據,並且我處於一個具有父行和子行的表的位置。子行與父行具有相同的列,但子列在列A中爲空,這是父行的主鍵和子行的外鍵。在MySQL中爲子行選擇父行單元值

的樣本數據

- 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 

我怎麼能填有NULL與父母行的值的行2,3,4員工編號。

讓員工編號欄變成這樣

- 33400 
- 33400 
- 33400 
- 43443 
- 43443 

注:更新 這是一個真實的場景,所以沒有父行的字段是必要識別它的子行。不幸的是,上面的表格暗示employee name這樣做。

什麼是確定子父行依賴是AI ID列。當所有行按AI ID排序時,每個子行都屬於它上面的第一行,並帶有employer number NOT NULL。因此,理想情況下,我在查看具有以下功能的查詢:

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 

上述類型的東西。

+1

一般注意:下面給出的答案假定父職員姓名是唯一的。如果情況並非如此,那麼對於一家真實的公司而言,這很可能是這種情況,那麼這些答案可能無法按預期工作。理想情況下,你的表有一個名爲「parent」的列,該列將包含其父職員的ID。 –

+0

嗨,謝謝你的回答。是的,這是一個真實的世界情景,不幸的是,在這種情況下不能使用員工姓名。我並不打算這麼暗示。我已經添加了我打算將查詢綁定到父行的子行。請參閱更新。 –

+0

單獨使用AI ID在這裏沒有幫助,因爲您的表沒有關於這些IDd如何相互關聯的信息。 –

回答

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 
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; 
+0

以及如果幾名員工稱爲「約翰」? –

+0

@OtoShavadze當然,我的查詢會中斷。理想情況下,我們應該加入某種代表親子關係的身份證/數字欄。對於這個實際問題的目的,我認爲OP只是想看到一個通用的方法。 –

+0

是的。只要讓他(OP)知道,如果員工姓名不唯一(和孩子總是包含父母名稱),這可能會導致意想不到的結果 –

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

+0

嗨Giorgos,檢查我們的www.rextester.com,它比SQL更好,更可靠小提琴,這是一半的時間。 –

+0

@TimBiegeleisen感謝您的提示。過去一個月我已經在使用rextester了。我首先嚐試使用sqlfiddle,不過由於其'text-to-ddl'功能很好。 –

0

我會建議你做這個表更新之前做更多的研究。通常情況下,我們可以讓員工擁有相同的姓名。在這種情況下,您將最終更新具有NULL員工編號的記錄,但不正確Employee Number

經過您的研究,編寫一個包含少量sql語句的腳本來完成此目的,而不是單個更新。不要錯過對桌子的備份。