我有一个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
答案 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}} max
值id
。
答案 4 :(得分:1)
我认为您必须创建(生成循环)临时表,其中包含从1到N的完整数字序列(其中N是计数表的MAX(Id))。然后继续加入该表并应用GROUP BY子句。
答案 5 :(得分:1)
您需要整数范围才能根据ID对表进行外连接。如果您不想使用临时表,则生成一系列整数取决于SQL供应商。有关如何根据SQL供应商执行此操作的提示,请参阅SQL SELECT to get the first N positive integers。