2017-03-17 11 views
3

Excelシートからデータをインポートしていますが、親と子の行を持つテーブルが1つあります。子行は親行と同じ列を持ちますが、親行の主キーである列Aには子行がNULLを持ち、子行は外部キーです。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

一般的な注:親の従業員名は一意であると仮定します。実際の会社の場合とほとんど同じではない場合、これらの回答は期待どおりに機能しない可能性があります。理想的には、テーブルには親の従業員のIDを含む 'parent'という列があります。 –

+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

と、複数の従業員が「John」と呼ばれる場合はどうなりますか? –

+0

@OtoShavadzeもちろん、私のクエリは壊れます。理想的には、親子関係を表す何らかのID /数値列に参加する必要があります。この実際の質問の目的のために、私はOPは一般的なアプローチを見たいと思う。 –

+0

はい。従業員の名前が一意でない場合(子供が常に親の名前を含む場合)、予期しない結果が生じる可能性があります。 –

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はチップをありがとう。私はすでに過去1ヶ月間rextesterを使っています。私はまず、sqlfiddleを試してみましょう。なぜなら、その素敵な 'text-to-ddl'機能だからです。 –

0

私はあなたがこのテーブルの更新を行う前に、より多くの研究を行うことをお勧めします。同じ名前の従業員を雇うことができるのは通常の場合です。その場合、NULLの従業員番号が正しくないレコードEmployee Numberを更新することになります。

調査後、単一の更新プログラムを起動するよりも目的を実行するSQL文が少ないスクリプトを作成します。あなたのテーブルのバックアップを取ることをお見逃しなく。ここで

関連する問題