Sqlite

另一個關於 2 個表的新手查詢

  • November 1, 2018

我在解決這個看似簡單的查詢時遇到了麻煩,如果有任何關於使用 Sqlite 的解決方案的建議,我將不勝感激。

我有兩個表 t1 和 t2 :

例如。,

Table1 :
--------

Key  Data
A    data11
A    data12
A    data13
B    data21
B    data22
B    data23

Table2 :
--------
Key  Data
A    datax
B    datay

我想把 Table2 填充成這樣:

Table2 :
--------
Key  Data
A    datax
A    null
A    null
B    datay
B    null
B    null

即,這樣兩個表對於每個 Key 值都有相同數量的條目。

CREATE TABLE T1(key,data);
CREATE TABLE T2(key,data);
INSERT INTO T1 VALUES ("A","data11"),("A","data12"),("A","data13"), ("B","data21"),("B","data22"),("B","data23");
INSERT INTO T2 VALUES ("A","datax"),("B","datay");

我嘗試了以下方法:

CREATE TABLE T1(id integer primary key autoincrement,key,data);
CREATE TABLE T2(id integer primary key autoincrement,key,data);
INSERT INTO T2 SELECT NULL,T1.KEY,NULL FROM T1 LEFT JOIN T2 USING (key,id);

這會添加太多行(6 行而不是 4 行)。兩個表中的行數應該相同。

|1|A|datax
|2|B|datay
|3|A|Null
|4|A|Null
|5|A|Null
|6|B|Null
|7|B|Null
|8|B|Null

附加記錄只是填充,以便兩個表具有相同的行數。這簡化了創建報告的任務,其中每個類別的每個鍵都有可變數量的項目。我不知道該怎麼做,而且花了很長時間才想出這個解決方案。

ID 列在填充表時自動遞增。我有 Sqlite 3.13.0。實際上,“key”欄位是項目程式碼,“data”欄位是來自 2 個儲存庫的對象名稱。該報告應該顯示給定項目的活動對像以及在哪個儲存庫上。

嘗試:

INSERT INTO T2 
SELECT NULL,T1.KEY,NULL 
FROM T1 
LEFT JOIN T2 USING (key,id)
WHERE T2.KEY IS NULL;

這應該過濾您的聯接以僅選擇 T2 中目前沒有數據值的那些行。

(這是您最初的嘗試,加上一個新WHERE子句)。

我相信這是一個解決方案,但沒有對性能或優雅表示贊同。它使用輔助表來允許最終報告顯示正確的輸出,並添加虛擬記錄以確保兩個表具有相同數量的記錄。我會很感激這樣做的不那麼笨拙的方式。

CREATE TABLE T1(id INTEGER PRIMARY KEY AUTOINCREMENT,key,data);
CREATE TABLE T2(id INTEGER PRIMARY KEY AUTOINCREMENT,key,data);
INSERT INTO  T1 VALUES -- LOAD T1 TEST DATA
(NULL,"A","T1A1")
,(NULL,"A","T1A2")
,(NULL,"A","T1A3")
,(NULL,"B","T1B1")
,(NULL,"B","T1B2")
,(NULL,"B","T1B3");
INSERT INTO  T2 VALUES -- LOAD T2 TEST DATA
(NULL,"A","T2A1")
,(NULL,"B","T2B1")
,(NULL,"C","T2C2")
,(NULL,"C","T2C1");
INSERT INTO  T1 SELECT NULL,key,NULL FROM T2 WHERE  id NOT IN (SELECT id FROM T1) OR key NOT IN (SELECT key FROM T1); -- PAD T1
INSERT INTO  T2 SELECT NULL,key,NULL FROM T1 WHERE  id NOT IN (SELECT id FROM T2) OR key NOT IN (SELECT key FROM T2); -- PAD T2
INSERT INTO  T1 SELECT NULL,key,NULL FROM T2 WHERE  id NOT IN (SELECT id FROM T1) OR key NOT IN (SELECT key FROM T1); -- PAD T1
CREATE TABLE T3(id INTEGER PRIMARY KEY AUTOINCREMENT, key,data); -- TEMP TABLE
INSERT INTO  T3 SELECT NULL,key,data FROM T2 ORDER BY key,data ; -- RENUMBER T2
CREATE TABLE T4(id INTEGER PRIMARY KEY AUTOINCREMENT, key,data); -- TEMP TABLE
INSERT INTO  T4 SELECT NULL,key,data FROM T1 ORDER BY key,data ; -- SORT & RENUMBER T1 as T4
.nullvalue '----'
.mode column
.header on
.width 2 5 5 5
SELECT 
 T4.id AS ID
, T4.key AS KEY
, T4.data AS T1
, T3.data AS T2 
FROM T4 
LEFT JOIN T3 USING (id,key);

-- ID  KEY    T1     T2   
-- --  -----  -----  -----
-- 1   A      T1A1   T2A1 
-- 2   A      T1A2   ---- 
-- 3   A      T1A3   ---- 
-- 4   B      T1B1   T2B1 
-- 5   B      T1B2   ---- 
-- 6   B      T1B3   ---- 
-- 7   C      ----   T2C1 
-- 8   C      ----   T2C2 

引用自:https://dba.stackexchange.com/questions/221431