即使SQL SELECT语句中的表中不存在值,也要获取值

时间:2012-02-06 09:45:49

标签: mysql sql select if-statement

我有一个MySQL表,看起来像这样:

|---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不存在,仍然以COUNTER值0返回ID。例如:

|---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语句?

提前致谢,Steve-O

6 个答案:

答案 0 :(得分:2)

您可以使用left join来解决您的问题。详细了解left join here

答案 1 :(得分:2)

它不是很强大,但是如果您创建了一个包含您想要的ID的临时表,那么您可以将连接保留到包含ID和Counter的表中,其中包含所有值:

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 :(得分: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

答案 3 :(得分: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)

您可以自行定义限制,我使用了来自min的{​​{1}} maxid

答案 4 :(得分:1)

我认为您必须创建(生成循环)临时表,其中包含从1到N的完整数字序列(其中N是计数表的MAX(Id))。然后继续加入该表并应用GROUP BY子句。

答案 5 :(得分:1)

您需要整数范围才能根据ID对表进行外连接。如果您不想使用临时表,则生成一系列整数取决于SQL供应商。有关如何根据SQL供应商执行此操作的提示,请参阅SQL SELECT to get the first N positive integers