Склеить две таблицы

-3

Рассмотрим две таблицы: Во-первых:

Id Data
1  asd
2  buu

И второе: UPD:

Id Data
10  ffu
11  fffuuu
10001  asd

Я хочу, чтобы таблица с четырьмя столбцами выглядела следующим образом:

Id1  Data1    Id2 Data2
1     asd      10     fuu  
2     buu      11     fffuuu
-1 [any text]  10001   asd

(если числа строк не равны, используйте "-1" для id) Как это сделать?

Я использую sqlite3-3.7.3.

UPD2: между таблицами нет подходящих критериев, любого случайного совпадения между ними будет достаточно для меня.

  • 0
    Цифры в столбце ID совпадают специально или это совпадение вашего примера?
  • 0
    Есть Id1 и Id2 означает всегда быть равны? Если так, то есть тривиальные ответы. Если нет, то вы должны знать , что таблицы в SQL не имеют определенный порядок - нет никакого способа , чтобы сказать «строку 1 таблицы 1 должен соответствовать строке 1 таблицы 2» - потому , что строки не нумеруются.
Показать ещё 8 комментариев
Теги:

1 ответ

3
Лучший ответ

Предполагая, что столбцы id уникальны, а не null, вы можете "застегнуть" ваши таблицы:

  1. Создание номера строки для каждой строки, которая соответствует положению строки, когда таблица упорядочена по уникальному идентификатору (как упоминал в своем комментарии полищук); а также,
  2. Имитация ПОЛНОЙ ВНЕШНЕГО СОЕДИНЕНИЯ с 2 ВЛЕВОЙ ВСТРОЕННЫМИ СОЕДИНЕНИЯМИ.

Чтобы продемонстрировать, я использовал две таблицы с разным количеством строк:

CREATE TABLE foo (id INTEGER PRIMARY KEY AUTOINCREMENT, data TEXT);
INSERT INTO foo VALUES (NULL, 'a');
INSERT INTO foo VALUES (NULL, 'b');
INSERT INTO foo VALUES (NULL, 'c');
INSERT INTO foo VALUES (NULL, 'd');
INSERT INTO foo VALUES (NULL, 'e');
INSERT INTO foo VALUES (NULL, 'f');
INSERT INTO foo VALUES (NULL, 'g');
INSERT INTO foo VALUES (NULL, 'h');
INSERT INTO foo VALUES (NULL, 'i');
INSERT INTO foo VALUES (NULL, 'j');
DELETE FROM foo WHERE data IN ('b', 'd', 'f', 'i');

CREATE TABLE bar (id INTEGER PRIMARY KEY AUTOINCREMENT, data TEXT);
INSERT INTO bar VALUES (NULL, 'a');
INSERT INTO bar VALUES (NULL, 'b');
INSERT INTO bar VALUES (NULL, 'c');
INSERT INTO bar VALUES (NULL, 'd');
INSERT INTO bar VALUES (NULL, 'e');
INSERT INTO bar VALUES (NULL, 'f');
INSERT INTO bar VALUES (NULL, 'g');
INSERT INTO bar VALUES (NULL, 'h');
INSERT INTO bar VALUES (NULL, 'i');
INSERT INTO bar VALUES (NULL, 'j');
DELETE FROM bar WHERE data IN ('a', 'b');

Чтобы получить более читаемый вывод, я тогда побежал:

.headers on
.mode column

Затем вы можете выполнить эту инструкцию SQL:

SELECT COALESCE(id1, -1) AS id1, data1, 
       COALESCE(id2, -1) as id2, data2 
FROM (
    SELECT ltable.rnum AS rnum, 
           ltable.id AS id1, ltable.data AS data1, 
           rtable.id AS id2, rtable.data AS data2
    FROM
        (SElECT (SELECT COUNT(*) FROM foo 
            WHERE id <= T1.id) rnum, id, data FROM foo T1
        ) ltable
        LEFT OUTER JOIN
        (SElECT (SELECT COUNT(*) FROM bar 
            WHERE id <= T1.id) rnum, id, data FROM bar T1
        ) rtable
        ON ltable.rnum=rtable.rnum
    UNION
    SELECT rtable.rnum AS rnum, 
           ltable.id AS id1, ltable.data AS data1, 
           rtable.id AS id2, rtable.data AS data2
    FROM
        (SElECT (SELECT COUNT(*) FROM bar 
            WHERE id <= T1.id) rnum, id, data FROM bar T1
        ) rtable
        LEFT OUTER JOIN
        (SElECT (SELECT COUNT(*) FROM foo 
            WHERE id <= T1.id) rnum, id, data FROM foo T1
        ) ltable
        ON ltable.rnum=rtable.rnum)
ORDER BY rnum

Что дает вам:

id1         data1       id2         data2     
----------  ----------  ----------  ----------
1           a           3           c         
3           c           4           d         
5           e           5           e         
7           g           6           f         
8           h           7           g         
10          j           8           h         
-1                      9           i         
-1                      10          j    

Это работает "в обоих направлениях", например, если вы инвертируете две таблицы (foo и bar), вы получаете:

id1         data1       id2         data2     
----------  ----------  ----------  ----------
3           c           1           a         
4           d           3           c         
5           e           5           e         
6           f           7           g         
7           g           8           h         
8           h           10          j         
9           i           -1                    
10          j           -1                  
  • 0
    Спасибо! Это то, что мне нужно.
  • 0
    @Noname111: Noname111: Полезно знать; не стесняйтесь пометить его как ответ, если он вас устраивает;)
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню