2011-07-21 49 views
-3

讓我們考慮兩個表: 第一:棒兩個表一起

Id Data 
1 asd 
2 buu 

和第二: UPD:

Id Data 
10 ffu 
11 fffuuu 
10001 asd 

我希望得到一個4列的表格看起來像這樣:

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列匹配的數字,或你的例子是巧合嗎? – inspite

+0

'Id1'和'Id2'是否意味着永遠是平等的?如果是這樣,那麼有一些微不足道的答案。如果沒有,那麼你需要知道SQL中的表具有** no **固有順序 - 沒有辦法說「表1的第1行應該匹配表2的第1行」 - 因爲行沒有編號。 –

+0

是的,這是一個巧合,這個ID不匹配porpose.I想要得到一個結果與任何隨機匹配 –

回答

3

假設ID列是唯一的並且不爲空,可以「壓縮」你的表格是:

  1. 創建對應於該行的 位置各行的行號當表由唯一的編號排序(如他在評論中提到的 polishchuk);和,
  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:很高興知道;隨時標記它作爲答案,如果它適合你;) – 2011-07-22 19:33:48

+0

@sixfeetsix,尼斯。 +1 –