2012-02-06 40 views
1

我有一個MySQL表,看起來像這樣存在:獲得價值,即使它不表從SQL SELECT語句

|---ID---|---COUNTER---| 
| 1 |  2  | 
| 2 |  6  | 
| 3 |  1  | 
| 5 |  9  | 
| 6 |  10  | 

我在尋找返回的ID和他們的COUNTER SELECT語句。該表只有ID,例如:1,2,3,5,6。是否有聲明說:我想要ID爲1到10,即使它們不存在於表格中,並且如果ID不存在,仍然返回ID與COUNTER值0.例如:

|---ID---|---COUNTER---| 
| 1 |  2  | 
| 2 |  6  | 
| 3 |  1  | 
| 4 |  0  | 
| 5 |  9  | 
| 6 |  10  | 
| 7 |  0  | 
| 8 |  0  | 
| 9 |  0  | 
| 10 |  0  | 

我是否必須創建一個包含NOT EXIST參數的SELECT語句?

在此先感謝,史蒂夫 - O

+1

數據庫無法返回不存在的ID,因爲它不知道它應該。你有另外一張表來定義什麼是有效值? – 2012-02-06 09:59:32

+0

@Jan Hudec:不,我知道我沒有一個很愚蠢。但是,有什麼方法可以用LEFT JOIN完成我的目標? – ClydeFrog 2012-02-06 10:03:35

+0

「我想要ID的1到10」 - 其中是1到10的範圍嗎?例如在桌子上?作爲參數傳入? – onedaywhen 2012-02-06 11:25:47

回答

2

,而無需創建一個臨時表:

select t.num as id, coalesce(yt.counter, 0) 
from your_table yt 
right join (
    select 1 as num union select 2 union select 3 union select 4 union select 5 union 
    select 6 union select 7 union select 8 union select 9 union select 10 
) t on yt.id = t.num 
order by t.num 

和位更普遍的:

select t.num as id, coalesce(yt.counter, 0) 
from your_table yt 
right join (
    select t1.num + t2.num * 10 + t3.num * 100 as num 
    from (
     select 1 as num union select 2 union select 3 union select 4 union select 5 union 
     select 6 union select 7 union select 8 union select 9 union select 0 
    ) t1 
    cross join (
     select 1 as num union select 2 union select 3 union select 4 union select 5 union 
     select 6 union select 7 union select 8 union select 9 union select 0 
    ) t2 
    cross join (
     select 1 as num union select 2 union select 3 union select 4 union select 5 union 
     select 6 union select 7 union select 8 union select 9 union select 0 
    ) t3 
) t on yt.id = t.num 
where t.num between (select min(id) from your_table) and (select max(id) from your_table) 

你可以自己在這裏定義限制我使用minyour_tableid價值max

+0

我應該用我的表名替換'y'和'yt'嗎? – ClydeFrog 2012-02-06 10:08:17

+0

@ Steve-O'yt'只是一個別名,所以你可以保持原樣(或者如果你不喜歡就更改)。只有'your_table'變成適當的表名,如果列是正確的,這應該沒問題。 – 2012-02-06 10:14:53

+0

謝謝!那真的有訣竅。你救了我的一天! – ClydeFrog 2012-02-06 10:22:32

2

您可以使用left join解決您的問題。閱讀更多關於left joinhere

+0

在sql中有不同的方法來做同樣的事情,我已經給出了一種方法。 – 2012-02-06 11:25:07

+0

-1:Downvoter請評論。如果@ doneay,當你完成它,請讓我知道如果這是不正確的答案。 – 2012-02-06 11:29:24

+0

我沒有說「應該」,「將會」是建議,「應該」是強制性的。反正更新了我的答案。 – 2012-02-06 12:08:49

1

我想你必須創建(生成循環)臨時表的數字從1到N(其中N是計數表的MAX(Id))的完整序列。然後,將其加入該表並應用GROUP BY子句。

2

這不是很強勁,但如果你創建了一個臨時表中的ID,你在它想要的,然後你可以離開了加入到你的表包含ID和計數器這將包括所有的值:

Declare @tempidtable as table (imaginaryid int) 

insert into @tempidtable (imaginaryid) values (1) 
insert into @tempidtable (imaginaryid) values (2) 
insert into @tempidtable (imaginaryid) values (3) 

select 
@temptable.imaginaryid, 
ISNULL(yourothertable.counter, 0) 
from @tempidtable 
left join yourothertable 
on @tempidtable.imaginaryid = yourothertable.id 

正如Tomek所說,你可以循環插入以便維護,或者可能將希望作爲基礎的ID存儲在另一個表中,將此用作聯接的基礎,而不是臨時表。

2

與所有可能的ID創建一個表:

create table Numbers (nr int primary key); 

declare i int default 1; 

while i < 100000 do 
    insert into Numbers (nr) values (i); 
    set i = i + 1; 
end while; 

然後你可以使用left join返回所有的數字:與你的表

select n.NR 
,  c.Counter 
from Numbers n 
left join 
     Counters c 
on  c.ID = n.NR