我看到像
这样的查询select *
from Table1
group by Step
having count(*) % 2 = 1
关于having count(*) % 2 = 1
任何人都可以解释一下吗?
编辑:常见的使用领域是什么?
答案 0 :(得分:21)
%%是模运算符,它给出除数的余数,因此当数字可以被2(偶数)整除时,它将给出0,而当没有时,它将给出1(例如,它是奇数)。因此查询基本上选择计数为奇数的元素(如上所述)。
答案 1 :(得分:15)
这不会检查每个步骤是否有奇数个条目吗?
答案 2 :(得分:4)
它将返回所有具有奇数行的步骤。
答案 3 :(得分:2)
只是测试它
declare @t1 table (step char(1))
insert into @t1(step)
select 'a'
union all select 'b'
union all select 'b'
union all select 'c'
union all select 'c'
union all select 'c'
union all select 'd'
union all select 'd'
union all select 'd'
union all select 'd'
select * from @t1
group by step
having count(*)%2 = 1
将返回存在的列步骤的值添加次数
在此示例中,它将返回
'a'
'c'
select *
在这里令人困惑,我宁愿把它写成
select step from @t1
group by step
having count(*)%2 = 1
或甚至提高可见度
select step, count(*) from @t1
group by step
having count(*)%2 = 1
答案 4 :(得分:1)
COUNT(*)将计算数据库中的所有行。 %是模数字符,它将为您提供除法问题的剩余部分。所以这是将所有行除以2并返回剩余为1的那些行(意味着奇数行。)
正如Erik指出的那样,那不是所有的行,而是按步骤分组的行,这意味着这是每步的所有奇数行。
答案 5 :(得分:1)
这样做的理由:
假设您要将奇数和偶数条目分成两列。你可以将偶数用于其中一个而奇数用于另一个。
我也把它放在评论中,但没有得到答复。
答案 6 :(得分:1)
我们不可能在不知道表格的用途的情况下回答你的问题。
对于给定的“步骤”,可能需要具有相同数量的“某物”,并且这将产生要在某些界面中显示的元素列表,而不是这种情况。
实施例: 让我们暂时忘记“步骤”,并假设这是一个学生表,而“步骤”则是学生分开的“团体”。对一个小组的要求是,有一定数量的学生,因为学生将成对工作。对于管理工具,您可以编写这样的查询,以查看不适用的组列表。
组:计数 A,10 B,9 C,17 D,8 E,4 F,5
查询将返回组B,C,F
答案 7 :(得分:0)
感谢大家。你们所有人都说查询会返回有奇数的分组行。
但这不是重点!我将继续检查这个案例,并在程序员的脑海中写出原因(如果我找到谁写这个)
经验教训:程序员必须写出关于愚蠢逻辑的评论......