2012-09-24 119 views
1

這是針對Android SQLite的。我有兩個疑問是這樣的:如何將兩個查詢合併爲一個?

select * from table where name='name'; 

select * from table where name!='name' order by name; 

我想創建它結合了這兩個查詢的聲明。我嘗試了所有的聯盟,但是我不能通過一個聲明來排序,然後結合。我試過這個:

select * from table where name='name' 
union all 
select * from table where name!='name' order by name; 

它所做的只是組合查詢,然後按名稱排序。我不想那樣。我想先在第二個陳述上做訂單,然後合併它們。

以不同的方式提出問題,這是我的數據:

Name 

a 
b 
c 
d 
e 
f 
g 
h 
i 
j 

但我想輸出是:

Name 

g 
a 
b 
c 
d 
e 
f 
h 
i 
j 

我希望得到一個排的頂部,然後訂購其餘的行。任何幫助表示讚賞。

回答

4

不需要使用臨時表,您需要添加一個額外的列進行排序。這樣的事情:

select 1, * from table where name='name' 
union all 
select 2, * from table where name!='name' 
order by 1, name; 

我沒有一個SQLite現在安裝,但這個技巧應該工作。 (您可能必須向第一列添加別名)。

+0

哦我只是編輯添加一個類似的建議,但這是一個聰明的方式來做到這一點... –

+0

謝謝你的回答。這是我做的,它沒有工作: 選擇1,*從團隊中的聯賽=「聯盟」和名稱=「名」 UNION ALL 選擇2,*從團隊中的聯賽=「聯盟」和名稱!='name'按2排序,名稱desc; 它沒有工作。 –

+0

謝謝你,我只是想出了自己。 –

1

除非有一些其他屬性的表,你可以用來提供排序,允許兩個選擇之間的連接,如How to combine two sql queries?那麼我認爲你將不得不存儲查詢的結果應該浮動到頂部在臨時表中,然後在存儲它之前將排序後的結果添加到該表中。

我從來沒有在Android中使用臨時表,所以不能提供一個例子,但據我所知,這是可能的。

我建議分開運行這兩個查詢,然後在代碼中結合結果,如果這可能在你的情況。

1

根據SQLLite文檔,這不能用UNIONUNION ALL來完成,因爲這些操作必須在簡單選擇上執行(不包括Order by)。

http://www.sqlite.org/lang_select.html

有可能是一個非常聰明的辦法做到這一點,我不知道,這通常會導致我只是做兩個查詢,並在Java相結合的結果。

[編輯] Jhovanny有非常聰明的方式來做到這一點。

1

現在不能測試,但這樣的事情應該工作:

select t.*, case when name = 'name' then 0 else 1 as o from table t order by o, name; 

那麼你沒有這兩個選擇,也沒有工會。假設你可以在android的sqlite中使用case語句。