2013-10-27 20 views
20

Orijinal sorguda tam dış birleşim sorgusu yazıyorsunuz?nasıl erişim

Ben varsayıyorum:

SELECT * 
FROM AA 
FULL LEFT JOIN BB ON (AA.C_ID = BB.C_ID); 

ben "TAM" kriterleri önce doğru Access ile uyumlu bir sorgunun içine ilk sorgu dönüştürme ediyorum ele değil mi?

cevap

26

AA ve BB'de yinelenen satırlar olmadığı varsayılırsa (yani, tüm aynı değerler), bir tam dış birleşim, bir sol birleştirmenin ve bir sağ birleştirmenin birliğinin eşdeğeridir.

SELECT * 
    FROM AA 
     LEFT JOIN BB ON AA.C_ID = BB.C_ID 
UNION 
SELECT * 
    FROM AA 
     RIGHT JOIN BB ON AA.C_ID = BB.C_ID 

orada yinelenen satırlar (ve bunları saklamak istediğiniz), sonuna veya AA'dan rekoru orada tekabül değilse sadece null başka sahasında WHERE AA.C_ID IS NULL ekleyin.

DÜZENLEME:

benzer bir yaklaşım here bakınız.

O önerir daha ayrıntılı fakat

SELECT * 
    FROM AA 
     JOIN BB ON AA.C_ID = BB.C_ID 
UNION ALL 
SELECT * 
    FROM AA 
     LEFT JOIN BB ON AA.C_ID = BB.C_ID 
    WHERE BB.C_ID IS NULL 
UNION ALL 
SELECT * 
    FROM AA 
     RIGHT JOIN BB ON AA.C_ID = BB.C_ID 
    WHERE AA.C_ID IS NULL 

Ancak bu AA.C_ID ve BB.C_ID boş olmadığını varsayar daha fazla ölçülebilir.

6

daha eficient ve daha hızlı kod:

Ben alan adları her iki tablonun aynı olup olmadığını onlar * operatörünü kullanmak yerine tek tek listelenmiş gerekecektir bulundu
SELECT * 
    FROM AA 
     LEFT JOIN BB ON AA.C_ID = BB.C_ID 
UNION ALL 
SELECT * 
    FROM AA 
     RIGHT JOIN BB ON AA.C_ID = BB.C_ID 
    WHERE AA.C_ID IS NULL 
1

. Ayrıca, ikinci SELECT ifadesinin diğer tabloya başvurması gerekir. Sadece ilk olarak aynı SQL'i kullanarak ve DOĞRU BİR YAZICI'ya değiştirerek satırların BB tablosuna eklenmesine izin vermez.

SELECT AA.C_ID 
FROM AA 
LEFT JOIN BB ON 
    AA.C_ID = BB.C_ID 
UNION ALL 
SELECT BB.C_ID 
FROM BB 
LEFT JOIN AA ON 
    AA.C_ID = BB.C_ID 
WHERE AA.C_ID IS NULL;