2012-04-27 113 views
0

我有一個表Emp例如。Sqlite選擇查詢 - 返回默認行?

---------------------- 
eName  | eId 
---------------------- 
Anusha  1 
Sunny  2 

說我要找(條目希望編寫發現該行並顯示它。但是如果它不覺得它預計將顯示一個默認行查詢id爲3.I溫度, 999)

select case 
when (total != 0) then (select eName from Emp where eId = 3) 
when (total == 0) then "temp" 
end as eName, 
case 
when (total != 0) then (select eId from Emp where eId = 3) 
when (total == 0) then 999 
end as eId 
from Emp,(select count(*) as total from Emp where eId = 3); 

使用此查詢,我寫它給了我兩行的結果。

temp 999 
temp 999 

我想這是因爲 (select count(*) as total from Emp where eId = 3)此查詢在從查詢的列表。

我嘗試使用distinct子句,它給我只有一行。但我有點懷疑,如果我搞亂查詢,只試圖可能僱用黑客做它。請建議是否有更好的方法來做到這一點,或者如果我錯了。

回答

0

我會知道如何做到這一點,但首先讓我給你一個很長的答案,可能會幫助你理解SQL。發生了什麼事情是這樣的:

您的select子句不會影響您獲得的記錄數。爲了理解發生的事情,讓我們簡化查詢。讓我們將其更改爲,

select * from emp, (select count(*) as total from emp where eid=3) 

我不知道你怎麼想的逗號「EMP」後確實在這裏,但SQL認爲這是一個老式的加入兩個表:emp和通過創建臨時表選擇計數(*)等。沒有WHERE子句,所以這是一個交叉連接,但第二個表只有一個記錄,因此該部分無關緊要。但是沒有WHERE子句的事實意味着你將得到emp中的每條記錄,並加入到count中。所以這個查詢的輸出是:

ename eid count(*) 
Anusha 1 0 
Sunny 2 0 

如果你有100條記錄,你會得到100條結果。

坦率地說,沒有真正乾淨的方法來做你想要的SQL。這是在代碼中乾淨的事情:做一個簡單的「select ... where eid = 3」,如果你沒有記錄,在運行時填寫默認值。

但是假設你需要做的是在SQL出於某種原因,我認爲最簡單的方法是:

select eid, ename from emp where eid=3 
union 
select 999 as eid, 'temp' as ename 
where not exists (select 1 from emp where eid=3) 

在SQL的某些版本中,你需要給第二選擇一個虛擬表名,就像甲骨文要求你說「從雙重」。

+0

傑伊,我幾乎忘了它意味着一個join.Not沒有在哪裏caluse意思是一個交叉連接對我來說有點新。現在是我刷新我的sql基礎知識的時候了。感謝它真的幫助了我目前正在做的事情。這是一個非常詳細的解釋,非常感謝! – 2012-04-27 20:31:39

+0

我認爲有很多可以說是新的語法,你寫單詞JOIN顯示連接。但是,是的,如果您在FROM中命名了兩個表格,那麼您將第一個表格中的每個記錄與第二個表格中的每個記錄進行配對,即如果表格A中有3個記錄,並且表格B中有4個記錄, 3 * 4 = 12個記錄,然後受WHERE子句中的條件限制。通常情況下,您希望排除大部分記錄的條件,比如a.customer_id = b.customer_id或其他類似的條件,以僅獲得有意義的對。 – Jay 2012-05-02 20:58:31