2012-04-05 66 views
1

我簡化了這個問題,所以它更容易發佈。我堅持添加與其他表格無關的配置表。如果您寧願跳過查看我真正的問題是什麼,請查看當前的最終輸出以及所需的最終輸出。爲了方便,最後我有一個非工作的SQL解決方案。SQLITE3:使用多行的兩個不相關表的聯合

請幫助和提前致謝!

背景

基本上,我已經得到了有8個內聲明連接來連接各種表格數據。我原本有8個不同的查詢,但在我的嵌入式機器上,查詢運行大約2-3秒,每個查詢總共花費20-30秒。這太長了。大部分時間是交易設置和拆解;查詢速度非常快。由於我想在1-2秒的時間範圍內獲取數據,因此我決定將所有查詢合併到一個查詢中。不幸的是,這些表本身是外部數據庫的重複內容,不能從嵌入式設備查詢;我不願意將此時的數據合併到一張表中。該設備只有python2.5和sqlite3,但我已經安裝了sqlalchemy,並且我通常在我的代碼中使用ORM。不幸的是,我無法在機器上生成更多的二進制文件,但是我可以寫出儘可能多的python以滿足我的心願。

數據

表1:用戶

name | number | data 
-------------------------------- 
alpha | 12345 | special 
beta  | 54321 | special-er 

表2(無關表1):配置

name | data 
-------------------------------- 
lang | eng 
big  | 24 
medium | 20 
small | 13 

決賽桌輸出什麼,我現在越來越:

name | number | data   | config 
----------------------------------------------- 
alpha | 12345 | special  | {null} 
beta  | 54321 | special-er | {null} 
{null} | {null} | {null}   | lang:eng 
{null} | {null} | {null}   | big:24 
{null} | {null} | {null}   | medium:20 
{null} | {null} | {null}   | small:13 

決賽桌輸出我想要的東西:

name | number | data   | config 
----------------------------------------------- 
alpha | 12345 | special  | lang:eng, big:24, medium:20, small:13 
beta  | 54321 | special-er | lang:eng, big:24, medium:20, small:13 

電流(非工作)解決方案

這是我到目前爲止有:

<!-- language: sql --> 
SELECT * 
FROM (
SELECT u.name as name 
       ,u.number as number 
       ,u.data as data 
       ,NULL as config 
FROM users u 
UNION 
SELECT NULL as name 
       ,NULL as number 
       ,NULL as data 
       ,c.name||":"||c.data as config 
FROM configurations c 
) t 

回答

0

你能剛發出選擇作爲同一交易中的兩個單獨的陳述?

我正在做類似的事情,我通過HTTP鏈接發送SQL並將數據發送回格式化爲JSON。鏈接的延遲是1-2秒,因此發送多個請求是正確的。就我而言,我發現我可以發出由分號分隔的選擇呼叫,例如,這樣的事情可能工作:

SELECT * 
FROM (
SELECT u.name as name 
       ,u.number as number 
       ,u.data as data 
       ,NULL as config 
FROM users u; 

SELECT NULL as name 
       ,NULL as number 
       ,NULL as data 
       ,c.name||":"||c.data as config 
FROM configurations c 
) t 

注:我只是複製你的了更換UNION用分號,在第二次看這也許不是很正確,但希望你的想法。

我不確定您是否需要將其包裝在BEGIN TRANSACTION ... END TRANSACTION - 我會在服務器上自動執行所有查詢。我也使用SQLite3的C接口,爲我在其中爲響應生成JSON表的每一行獲取函數回調。我沒有區分每個查詢的結果;他們都去了相同的功能,所以這可能是使我的情況這項工作的神奇 - 它會產生有趣的結果,如果每個查詢不具有相同數量的列。

+0

我正在使用幾代以前的ARM處理器的嵌入式設備(閱讀:真的很慢)。兩個選擇對我的應用程序來說太長了。 – 2012-12-07 19:23:55