2013-03-16 58 views
2

我需要一個查詢,選擇一堆條目,然後與這些條目選擇一堆行成一行。下面顯示了一個典型的條目,以及典型的結果需要的樣子。Sqlite選擇多行成一行

table1 
id 
------- 
3  

table2 
id  value  table1 
-------------------------- 
5  value1  3 
6  value2  3 

table3 
id  value  table1 
------------------------- 
9  value3  3 
10  value4  3 

table4 
id  table1 
--------------- 
14  3 
15  3 

table5 
id  value  table4 
------------------------------- 
19  value5  14 
20  value6  14 
21  value7  15 


result 
result1 result2  result3  result4 
------------------------------------------------------ 
3  value1  value3  value5, value6; value7 

只需要表1和表2的第一個結果。表2通常可以爲null,value3需要進入result2。 目前,我選擇了statment像下面只返回RESULT1每個條目,然後爲每個條目我爲每個結果做單獨的查詢

SELECT DISTINCT id FROM (
    -complicated select in here 
) AS temp; 

然後每個ID可分離執行:

SELECT value FROM table2 WHERE table1 = id LIMIT 1; 

SELECT value FROM table3 WHERE table1 = id LIMIT 1; 

SELECT value, table4.id FROM table4, table5 WHERE table4.id = table5.table4 AND table1 = id; 

並使用代碼將其格式化爲結果表格。

問題是隻有第一個查詢是在後臺線程上完成的,而其餘的都是在UI線程上完成的。我想在一個查詢中完成所有操作,但是將table4劃分爲一行並且只選擇了table2和table3的第一個結果。

+0

應該如何計算結果?爲什麼'value2'和'value4'不顯示? – 2013-03-16 10:07:28

+0

'表2通常可以爲null,value3需要進入result2'。此時你應該問自己,你的數據庫設計是否合適。這裏缺乏簡單的引發紅旗。 – Tim 2013-03-16 10:21:06

+0

但是看看這個:IFNULL http://www.sqlite.org/lang_corefunc.html#ifnull – Tim 2013-03-16 10:23:37

回答

3

對於像這樣的條件關係,您將有更容易的時間運行多個選擇,或創建一個臨時表,使用鍵分階段填充它,然後對臨時表進行最終選擇。

看着result4,實際上你試圖對錶格中的數據進行非規範化處理,然後用條件邏輯對外部連接進行重新歸一化處理,但這可能是可行的,但是會對'聰明'數據庫開發如果遇到問題,您很可能會得到一個幾乎不可能調試的查詢。

我知道sqlite是爲了在輕量級環境中使用SQL標準的一個簡單實現,所以我不確定SQL在陷入困境之前有多複雜。

這並不完全清楚,我你想實現什麼,但一個解決辦法可能是使用幾個UNION語句是這樣的:

SELECT DISTINCT source, id FROM (
    SELECT table2.table1 AS table1, 'table2' AS source, value AS id FROM table2 
    UNION 
    SELECT table3.table1, 'table3', value FROM table3 
    UNION 
    SELECT table4.table1, 'table5', value FROM table5, table4 
    WHERE table4.id = table5.table4) 
WHERE table1 = 3; 

然後你會得到結果是這樣的:

source | id 
----------------------- 
table2 | value1 
table3 | value3 
table4 | value5 
table4 | value6 
table4 | value7 

你的其他選擇是創建一個包含所有聯合的視圖(以及所有三個列,不僅僅是上面選擇的兩個列),然後你可以選擇table1的值來獲得相同的結果。

+0

您好,我已經在'2 Tables'上應用了'InnerJoin',在'First Table'中的主鍵是'Second Table'中的外鍵。第二個表有3行與外鍵關聯我已經設法rawquery,但不知道如何讀取光標讓說在第一個表中有1行,從一個查詢中第二個表中有3行。 – 2015-02-09 10:43:51