2016-03-29 28 views
2

テーブルを2つの参照テーブルに分割しようとしましたが、新しいテーブルの1つの母集団に問題があります。古いテーブルの列がA, B, C, X, Y, Zで、最初の新しいテーブルがA, B, C, IDで、2番目のテーブルがID, X, Y, Zであるとします。第二のテーブルを移植LEFT JOIN右テーブルの欠損値

は簡単です:私はこれが実行された後newTable2をチェックし、それが適切に移入され見ることができます

INSERT INTO newTable2 (`X`,`Y`,`Z`) 
SELECT DISTINCT `X`,`Y`,`Z` 
FROM oldTable; 

IDには表定義が取り込まれ、ヌル値はありません。私は最初のテーブルを作成することに問題があるようです。私はこのスクリプトを使用しようとした:

INSERT INTO newTable1 
SELECT oldTable.`A` 
    , oldTable.`B` 
    , oldTable.`C` 
    , newTable2.`ID` 
FROM oldTable 
LEFT JOIN newTable2 
ON newTable2.`X` = oldTable.`X` 
    AND newTable2.`Y` = oldTable.`Y` 
    AND newTable2.`Z` = oldTable.`Z`; 

をしかし、私は結果のテーブルをチェックするとき、私はほとんどの行のIDためのnull値を取得します。どのように入力されているのかによって、newTable2には行があり、oldTableの各行にはIDがあり、手動でチェックしたヌルの行には単純に見つからなかった値があります。

私はMySql 5.7を実行しており、ID以外のすべての列はvarcharです。

+1

は、X、YおよびZのNULL可能か?それらのうちの少なくとも1つ? – Pred

+0

@Predこれらはすべてnull可能ですが、それは関係がありますか? – Fr33dan

+3

NULLは結合条件でNULLと等しくありません。 nullを処理すると値が見つかります – Pred

答えて

1

あなたのJOIN条件はNULL値を処理しません。元の値をすべて元に戻したい場合は、それらを処理する必要があります。

NULL値を含むことができる各列に、このようなものを使用します。

(newTable2.`X` = oldTable.`X` OR (newTable2.`X` IS NULL AND oldTable.`X` IS NULL)) 
1

@Predは、JoinステートメントでNULLの場合を処理する必要があります。私は、ORステートメントを避けるために、ヌルセーフ<=>演算子を使用します。以下のような

何か:

INSERT INTO newTable1 
    SELECT oldTable.`A` 
     , oldTable.`B` 
     , oldTable.`C` 
     , newTable2.`ID` 
    FROM oldTable 
    LEFT JOIN newTable2 
    ON newTable2.`X` <=> oldTable.`X` 
     AND newTable2.`Y` <=> oldTable.`Y` 
     AND newTable2.`Z` <=> oldTable.`Z`;