SQLite中的三向全外连接

时间:2010-05-26 00:49:53

标签: database sqlite

我有三个带有公共密钥字段的表,我需要在这个密钥上加入它们。鉴于SQLite没有完整的外连接或右连接,我使用full outer join without right join technique on Wikipedia取得了很大的成功。

但我很好奇,如何使用这种技术通过公共密钥加入三个表?这会对效率产生什么影响(当前查询大约需要十分钟)?

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以使用UNION SELECT创建包含所有键的临时表。然后LEFT JOIN到这个临时表的其他表;

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

答案 1 :(得分:-3)

如果人们偶然发现这种情况,我最终尝试在第一次加入后使用临时表,然后加入这个临时表。这变得很麻烦,所以我最终切换到PostgreSQL(它有完整的外连接)。