Sqlite
另一個關於 2 個表的新手查詢
我在解決這個看似簡單的查詢時遇到了麻煩,如果有任何關於使用 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