Трехстороннее полное внешнее объединение в SQLite - PullRequest
2 голосов
/ 26 мая 2010

У меня есть три таблицы с общим полем ключа, и мне нужно соединить их по этому ключу. Поскольку SQLite не имеет полных внешних или правых объединений, я использовал метод полного внешнего объединения без правого объединения в Википедии с большим успехом.

Но мне любопытно, как можно использовать эту технику для объединения трех таблиц общим ключом? Как это влияет на эффективность (текущий запрос занимает около десяти минут)?

Спасибо!

Ответы [ 2 ]

1 голос
/ 17 октября 2012

Вы можете создать временную таблицу со всеми ключами с помощью UNION SELECT. А затем СЛЕДУЕТ ПРИСОЕДИНИТЬСЯ к этой временной таблице к другим таблицам;

    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);
0 голосов
/ 03 июня 2010

Если люди сталкиваются с этим позже, я в конце концов попытался использовать временные таблицы после первого объединения, а затем присоединился к этой временной таблице. Это стало проблемой, поэтому я в конечном итоге переключился на PostgreSQL (который имеет полные внешние соединения).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...