2016-03-29 27 views
2

Bir tabloyu, başvurulan iki tabloya ayırmaya çalışıyorum ve yeni tablolardan birinin popülasyonuyla ilgili sorunlar yaşıyorum. Eski tablonun A, B, C, X, Y, Z sütunlarını ve A, B, C, ID'u içeren ilk yeni tablonun ve ikincinin ID, X, Y, Z olmasını söyleyin. İkinci tablo doldurmamakSOL OKUMA sağ tablodaki değerleri eksik

önemsiz: Ben bu çalıştırıldıktan sonra newTable2 kontrol edip düzgün doldurulur görebilirsiniz

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

. ID, tablo tanımı ile doldurulur ve boş değer yoktur. İlk tabloyu doldururken sorunlarım var gibi görünüyor. Bu komut dosyasını kullanmak girişiminde:

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`; 

Ama çıkan tabloyu kontrol ederken çoğu satırlar için ID için boş değerler olsun. newTable2'un neden olduğu için oldTable'un her satırı için bir satır ve ID olması ve el ile işaretlemiş olduğum her satırın, bulunamayan bir değeri vardır.

MySql 5.7 çalıştırıyorum ve ID dışındaki tüm sütunlar varchar türünde.

+1

X, Y ve Z null musunuz? En az biri mi? – Pred

+0

@Pred Hepsi null, hepsi alakalı mı? – Fr33dan

+3

NULL, katılma koşullarında NULL ile eşit değildir. Boş değerlere geçin ve değerlerinizi bulabilirsiniz – Pred

cevap

1

JOIN koşulunuz NULL değerleri işlemez. Tüm orijinal değerlerini geri almak istiyorsan bunları halletmelisin.

NULL değerleri içerebilen her sütun için böyle bir şey kullanın.

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

@Pred'de belirtildiği gibi, Katılma ifadelerinizde NULL durumunu ele almanız gerekir. Aşağıdaki gibi

şey: Ben VEYA deyimi önlemek için boş güvenli <=> operatörü kullanırsınız

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`; 
İlgili konular