2013-12-17 34 views
0

說多個表我已經建立3個表,並填充它們像這樣:合併SQLite中

CREATE TABLE t1(sn INT PRIMARY KEY, val TEXT); 
INSERT INTO t1 (sn, val) VALUES (1,'Bobby'); 
INSERT INTO t1 (sn, val) VALUES (2,'Fred'); 
INSERT INTO t1 (sn, val) VALUES (3,'Ann'); 

T1看起來像這樣

sn  val 
1  Bobby 
2  Fred 
3  Ann 

CREATE TABLE t2(sn INT PRIMARY KEY, val INT); 
INSERT INTO t2 (sn, val) VALUES (2,5); 
INSERT INTO t2 (sn, val) VALUES (4,72); 
INSERT INTO t2 (sn, val) VALUES (5,7); 

T2看起來像這樣

sn  val 
2  5 
4  72 
5  7 

CREATE TABLE t3(sn INT PRIMARY KEY, val TEXT); 
INSERT INTO t3 (sn, val) VALUES (1,'A'); 
INSERT INTO t3 (sn, val) VALUES (5,'B'); 
INSERT INTO t3 (sn, val) VALUES (7,'C'); 
INSERT INTO t3 (sn, val) VALUES (9,'D'); 

T3看起來像這樣

sn  val 
1  A 
5  B 
7  C 
9  D 

現在我想創建一個名爲 「合併」 新表,並希望它看起來像這樣

sn t1.val t2.val t3.val 
1  Bobby    A 
2  Fred  5   
3  Ann 
4    72  
5    7   B 
7       C 
9       D 

我我正在使用sqlite3,並試圖使用左連接和聯合的組合,但我只能做到不超過2個表。我有很多這樣的表,並希望通過它們的主鍵來加入所有表。您的建議將非常感謝,並期待您的回覆。

回答

0

使用UNION子查詢來獲取所有sn值,然後用一束左側的加入對於每個基表:

CREATE TABLE merged AS 
SELECT tAll.sn, 
     t1.val, 
     t2.val, 
     t3.val 
FROM (SELECT sn FROM t1 
     UNION 
     SELECT sn FROM t2 
     UNION 
     SELECT sn FROM t3) AS tAll 
LEFT JOIN t1 ON tAll.sn = t1.sn 
LEFT JOIN t2 ON tAll.sn = t2.sn 
LEFT JOIN t3 ON tAll.sn = t3.sn 
0

因爲SQLite沒有FULL OUTER JOINRIGHT OUTER JOIN支持要做到這一點最簡單的方法是使用INSERT OR REPLACE INTO命令將數據集相結合,像這樣:

CREATE TABLE Result (sn INT PRIMARY KEY, val1 TEXT, val2 INT, val3 TEXT); 
-- 
INSERT OR REPLACE INTO Result (sn, val1, val2, val3) 
SELECT 
    sn 
    ,val AS val1 
    ,(SELECT val2 FROM Result AS R WHERE R.sn = sn) AS val2 
    ,(SELECT val3 FROM Result AS R WHERE R.sn = sn) AS val3 
FROM t1; 
-- 
INSERT OR REPLACE INTO Result (sn, val1, val2, val3) 
SELECT 
    sn 
    ,(SELECT val1 FROM Result AS R WHERE R.sn = sn) AS val1 
    ,val AS val2 
    ,(SELECT val3 FROM Result AS R WHERE R.sn = sn) AS val3 
FROM t2; 
-- 
INSERT OR REPLACE INTO Result (sn, val1, val2, val3) 
SELECT 
    sn 
    ,(SELECT val1 FROM Result AS R WHERE R.sn = sn) AS val1 
    ,(SELECT val2 FROM Result AS R WHERE R.sn = sn) AS val2 
    ,val AS val3 
FROM t3; 

這裏是展示它的工作一個SQL小提琴鏈接: http://www.sqlfiddle.com/#!7/ddfb7/2/0