2010-05-26 6 views
2

J'ai trois tables avec un champ de clé commun, et je dois les joindre sur cette clé. Étant donné que SQLite n'a pas de jointures externes ou droites complètes, j'ai utilisé le full outer join without right join technique on Wikipedia avec beaucoup de succès.Jointure externe complète à trois voies dans SQLite

Mais je suis curieux, comment utiliser cette technique pour rejoindre trois tables par une clé commune? Quels sont les impacts sur l'efficacité (la requête actuelle prend environ dix minutes)?

Merci!

Répondre

-3

Si les gens trébuchent à travers cela plus tard, j'ai finalement essayé d'utiliser des tables temporaires après la première jointure, puis rejoint sur cette table temporaire. C'est devenu un problème, donc je suis finalement passé à PostgreSQL (qui a des jointures externes complètes).

+2

La modification du moteur de base de données n'est pas la solution. – peterdemin

1

Vous pouvez créer une table temporaire avec toutes les touches avec UNION SELECT. Et puis LEFT JOIN à cette table temporaire d'autres tables;

CREATE TABLE a (
     tc INTEGER NOT NULL PRIMARY KEY, 
     v INTEGER 
    ); 
    CREATE TABLE b (
     tc NOT NULL PRIMARY KEY, 
     v INTEGER 
    ); 
    CREATE TABLE c (
     tc NOT NULL PRIMARY KEY, 
     v INTEGER 
    ); 
    INSERT INTO a (tc, v) VALUES(1, 10); 
    INSERT INTO a (tc, v) VALUES(2, 20); 
    INSERT INTO a (tc, v) VALUES(4, 40); 

    INSERT INTO b (tc, v) VALUES(1, 100); 
    INSERT INTO b (tc, v) VALUES(3, 300); 
    INSERT INTO b (tc, v) VALUES(5, 500); 

    INSERT INTO c (tc, v) VALUES(1, 1000); 
    INSERT INTO c (tc, v) VALUES(3, 3000); 
    INSERT INTO c (tc, v) VALUES(7, 7000); 

    CREATE TEMP TABLE keys 
    AS 
    SELECT tc as tc FROM a 
    UNION 
    SELECT tc as tc FROM b 
    UNION 
    SELECT tc as tc FROM c; 

    SELECT k.tc, a.v, b.v, c.v 
     FROM keys as k 
LEFT JOIN a ON (k.tc = a.tc) 
LEFT JOIN b ON (k.tc = b.tc) 
LEFT JOIN c ON (k.tc = c.tc); 
Questions connexes