由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Database版 - 奇怪的 SQL 问题
相关主题
请问个join的问题Re: 用Servlet显示数据库里的数据,分页的? (答案在这里)
常用SQL的误区???--新手请绕行how to fetch the first record from a table?
Teradata 的大拿呢数据库问题求解
怎样快速得到两个表的交集To get the 2nd, 3rd, 4th largest value
菜鸟问.asp 里的select语句在基于SQL sever和Access语法上的不请问sql这个querry怎么写
MySQL语句请教怎么用sql query 实现这个功能?
请教:如何优化,提取组间最大行怎么用Update实现这个?
Urgent SQL problem!请教一个mysql 排序问题。
相关话题的讨论汇总
话题: select话题: where话题: product话题: row话题: index
进入Database版参与讨论
1 (共1页)
i****a
发帖数: 36252
1
SQL Server 2012
select a / b
from table
Error: Divide by zero error encountered
select a / b
, row_number() over (order by ID)
from table
no error
why???
c****s
发帖数: 10
2
拿你的数据看看。
s**********o
发帖数: 14359
3
B可能有0或者NULL,还是数据本身的问题
c*****d
发帖数: 6045
4
估计是有人已经删除了0的记录
结论:
1。当被除数为0时“Divide by zero error encountered.”
2。在ORACLE和SQL Server中,(any number)/null结果都为NULL
试验
select @@version
-----------------------------------------------------------------
Microsoft SQL Server 2012 - 11.0.5343.0 (X64)
May 4 2015 19:11:32
Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows NT 6.1 (Build 7601: Service
Pack 1) (Hypervisor)
create table demo (id int, a int, b int)
insert into demo values(1,1,1)
insert into demo values(2,2,0)
insert into demo (id, a) values(3,3)
case 1:
select A/B, row_number() over (order by ID)
from demo
where id=1
----------- --------------------
1 1
case 2:
select A/B, row_number() over (order by ID)
from demo
where id=2
----------- --------------------
Msg 8134, Level 16, State 1, Line 1
Divide by zero error encountered.
case 3:
select A/B, row_number() over (order by ID)
from demo
where id=3
----------- --------------------
NULL 1
i****a
发帖数: 36252
5
update my post.
select a / b
from table
where x = y
I've found the reason:
even if the result with the where clause has no zero value problem, sql
optimizer is doing a / b for all records and then filter it down to where x
= y.
When I add the row_number function, optimizer execute the query with
filtering it down to x = y first.
c*****d
发帖数: 6045
6
你的解释不对,肯定不是先对所有行做a/b然后filter
用我上面的表和数据
select A/B
from demo
where 1=0
-----------
(0 row(s) affected)
按你的解释,即便这个sql不返回结果,因为在数据中有2/0,也要报错?
实验结果是不报错
select A/B
from demo
where id<2
-----------
1
(1 row(s) affected)
同样道理,不是先scan所有记录做A/B,然后再filter,那简直太傻瓜了

x

【在 i****a 的大作中提到】
: update my post.
: select a / b
: from table
: where x = y
: I've found the reason:
: even if the result with the where clause has no zero value problem, sql
: optimizer is doing a / b for all records and then filter it down to where x
: = y.
: When I add the row_number function, optimizer execute the query with
: filtering it down to x = y first.

i****a
发帖数: 36252
7
数据大的话, optimizer 如果认为更高效, 可以选择先对所有行做a/b.
我可以在我的数据库反复重现这结果. 刚刚才想起去看看 execution plan. 证明了这
个说法.
附件. 上面那个没有ROW_NUMBER, 下面有ROW_NUMBER. Compute Scalar 就是计算 a /
b.

【在 c*****d 的大作中提到】
: 你的解释不对,肯定不是先对所有行做a/b然后filter
: 用我上面的表和数据
: select A/B
: from demo
: where 1=0
: -----------
: (0 row(s) affected)
: 按你的解释,即便这个sql不返回结果,因为在数据中有2/0,也要报错?
: 实验结果是不报错
: select A/B

c*****d
发帖数: 6045
8
index是在哪个字段上?
另外你的x=y是x column = y column,还是x column = y value
我试了几个case,也确认了exec plan在使用索引
但是并没有出现zero divided的问题
create clustered index on (id,a,b)
create clustered index on (a,b)
i****a
发帖数: 36252
9
what if you join with another table?

【在 c*****d 的大作中提到】
: index是在哪个字段上?
: 另外你的x=y是x column = y column,还是x column = y value
: 我试了几个case,也确认了exec plan在使用索引
: 但是并没有出现zero divided的问题
: create clustered index on (id,a,b)
: create clustered index on (a,b)

B*****g
发帖数: 34098
10
shame on M$
加个hint看行不行?

/

【在 i****a 的大作中提到】
: 数据大的话, optimizer 如果认为更高效, 可以选择先对所有行做a/b.
: 我可以在我的数据库反复重现这结果. 刚刚才想起去看看 execution plan. 证明了这
: 个说法.
: 附件. 上面那个没有ROW_NUMBER, 下面有ROW_NUMBER. Compute Scalar 就是计算 a /
: b.

相关主题
MySQL语句请教Re: 用Servlet显示数据库里的数据,分页的? (答案在这里)
请教:如何优化,提取组间最大行how to fetch the first record from a table?
Urgent SQL problem!数据库问题求解
进入Database版参与讨论
c*****d
发帖数: 6045
11
实验了,还是无法复制出这个问题
你能一次把你的case说明白吗?
哪几个表,哪个字段有0,index在哪几个字段上
语句中x=y是字段x = 字段y ?

【在 i****a 的大作中提到】
: what if you join with another table?
c*****d
发帖数: 6045
12
虽然我教比软软的数据库nb很多
但是也不能这么瞎黑软软
这个query根本没法加hint
你说在oracle里怎么加hint能跳过predicate直接先对全表处理
类似select 2*id from table where id=1
把全部的id都double一遍之后再看谁符合条件

【在 B*****g 的大作中提到】
: shame on M$
: 加个hint看行不行?
:
: /

B*****g
发帖数: 34098
13
会不会是fetch多少records的问题?
2个query都套上count,看第二个会不会error

【在 c*****d 的大作中提到】
: 虽然我教比软软的数据库nb很多
: 但是也不能这么瞎黑软软
: 这个query根本没法加hint
: 你说在oracle里怎么加hint能跳过predicate直接先对全表处理
: 类似select 2*id from table where id=1
: 把全部的id都double一遍之后再看谁符合条件

i****a
发帖数: 36252
14
SELECT p.product_id
, pp.price / pp.regular_price
FROM product p
INNER JOIN productprice pp ON pp.product_id = p.product_id
WHERE p.type = 1
SELECT p.product_id
, pp.price / pp.regular_price
, ROW_NUMBER() OVER(ORDER BY p.product_id) AS RowNum
FROM product p
INNER JOIN productprice pp ON pp.product_id = p.product_id
WHERE p.type = 1
productprice 表, regular_price有零, 但 inner join p.type = 1 的结果是没有零的

【在 c*****d 的大作中提到】
: 实验了,还是无法复制出这个问题
: 你能一次把你的case说明白吗?
: 哪几个表,哪个字段有0,index在哪几个字段上
: 语句中x=y是字段x = 字段y ?

c*****d
发帖数: 6045
15
create table dbo.product
(product_id int, name varchar(20), type int)
create table dbo.productprice
(product_id int, price int, regular_price int)
insert into dbo.product values(1,'a',1)
insert into dbo.product values(2,'b',2)
insert into dbo.productprice values(1,1,1)
insert into dbo.productprice values(2,2,0)
SELECT p.product_id, pp.price / pp.regular_price discount
FROM product p
INNER JOIN productprice pp ON pp.product_id = p.product_id
WHERE p.type = 1
product_id discount
----------- -----------
1 1
(1 row(s) affected)
c*****d
发帖数: 6045
16
create index ind_p on dbo.product (product_id)
create index ind_pp on dbo.productprice (product_id)
SELECT p.product_id, pp.price / pp.regular_price discount
FROM product p
INNER JOIN productprice pp ON pp.product_id = p.product_id
WHERE p.type = 1
product_id discount
----------- -----------
1 1
(1 row(s) affected)
c*****d
发帖数: 6045
17
drop index ind_p on dbo.product
drop index ind_pp on dbo.productprice
create index ind_p on dbo.product (product_id,type)
create index ind_pp on dbo.productprice(product_id,price,regular_price)
SELECT p.product_id, pp.price / pp.regular_price discount
FROM product p
INNER JOIN productprice pp ON pp.product_id = p.product_id
WHERE p.type = 1
product_id discount
----------- -----------
1 1
(1 row(s) affected)
c*****d
发帖数: 6045
18
drop index ind_p on dbo.product
drop index ind_pp on dbo.productprice
create index ind_p on dbo.product (type)
create index ind_pp on dbo.productprice (price,regular_price)
SELECT p.product_id, pp.price / pp.regular_price discount
FROM product p
INNER JOIN productprice pp ON pp.product_id = p.product_id
WHERE p.type = 1
product_id discount
----------- -----------
1 1
(1 row(s) affected)
i****a
发帖数: 36252
19
也顷□痗q的问题. 你看我贴的 execution plan 就是这两个 query 的

【在 c*****d 的大作中提到】
: drop index ind_p on dbo.product
: drop index ind_pp on dbo.productprice
: create index ind_p on dbo.product (type)
: create index ind_pp on dbo.productprice (price,regular_price)
: SELECT p.product_id, pp.price / pp.regular_price discount
: FROM product p
: INNER JOIN productprice pp ON pp.product_id = p.product_id
: WHERE p.type = 1
: product_id discount
: ----------- -----------

i****a
发帖数: 36252
20
SQL Server 2012
select a / b
from table
where x = y
Error: Divide by zero error encountered
select a / b
, row_number() over (order by ID)
from table
where x = y
no error
why???
相关主题
To get the 2nd, 3rd, 4th largest value怎么用Update实现这个?
请问sql这个querry怎么写请教一个mysql 排序问题。
怎么用sql query 实现这个功能?random sampling with replacement, how?
进入Database版参与讨论
c****s
发帖数: 10
21
拿你的数据看看。
s**********o
发帖数: 14359
22
B可能有0或者NULL,还是数据本身的问题
c*****d
发帖数: 6045
23
估计是有人已经删除了0的记录
结论:
1。当被除数为0时“Divide by zero error encountered.”
2。在ORACLE和SQL Server中,(any number)/null结果都为NULL
试验
select @@version
-----------------------------------------------------------------
Microsoft SQL Server 2012 - 11.0.5343.0 (X64)
May 4 2015 19:11:32
Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows NT 6.1 (Build 7601: Service
Pack 1) (Hypervisor)
create table demo (id int, a int, b int)
insert into demo values(1,1,1)
insert into demo values(2,2,0)
insert into demo (id, a) values(3,3)
case 1:
select A/B, row_number() over (order by ID)
from demo
where id=1
----------- --------------------
1 1
case 2:
select A/B, row_number() over (order by ID)
from demo
where id=2
----------- --------------------
Msg 8134, Level 16, State 1, Line 1
Divide by zero error encountered.
case 3:
select A/B, row_number() over (order by ID)
from demo
where id=3
----------- --------------------
NULL 1
i****a
发帖数: 36252
24
update my post.
select a / b
from table
where x = y
I've found the reason:
even if the result with the where clause has no zero value problem, sql
optimizer is doing a / b for all records and then filter it down to where x
= y.
When I add the row_number function, optimizer execute the query with
filtering it down to x = y first.
c*****d
发帖数: 6045
25
你的解释不对,肯定不是先对所有行做a/b然后filter
用我上面的表和数据
select A/B
from demo
where 1=0
-----------
(0 row(s) affected)
按你的解释,即便这个sql不返回结果,因为在数据中有2/0,也要报错?
实验结果是不报错
select A/B
from demo
where id<2
-----------
1
(1 row(s) affected)
同样道理,不是先scan所有记录做A/B,然后再filter,那简直太傻瓜了

x

【在 i****a 的大作中提到】
: update my post.
: select a / b
: from table
: where x = y
: I've found the reason:
: even if the result with the where clause has no zero value problem, sql
: optimizer is doing a / b for all records and then filter it down to where x
: = y.
: When I add the row_number function, optimizer execute the query with
: filtering it down to x = y first.

i****a
发帖数: 36252
26
数据大的话, optimizer 如果认为更高效, 可以选择先对所有行做a/b.
我可以在我的数据库反复重现这结果. 刚刚才想起去看看 execution plan. 证明了这
个说法.
附件. 上面那个没有ROW_NUMBER, 下面有ROW_NUMBER. Compute Scalar 就是计算 a /
b.

【在 c*****d 的大作中提到】
: 你的解释不对,肯定不是先对所有行做a/b然后filter
: 用我上面的表和数据
: select A/B
: from demo
: where 1=0
: -----------
: (0 row(s) affected)
: 按你的解释,即便这个sql不返回结果,因为在数据中有2/0,也要报错?
: 实验结果是不报错
: select A/B

c*****d
发帖数: 6045
27
index是在哪个字段上?
另外你的x=y是x column = y column,还是x column = y value
我试了几个case,也确认了exec plan在使用索引
但是并没有出现zero divided的问题
create clustered index on (id,a,b)
create clustered index on (a,b)
i****a
发帖数: 36252
28
what if you join with another table?

【在 c*****d 的大作中提到】
: index是在哪个字段上?
: 另外你的x=y是x column = y column,还是x column = y value
: 我试了几个case,也确认了exec plan在使用索引
: 但是并没有出现zero divided的问题
: create clustered index on (id,a,b)
: create clustered index on (a,b)

B*****g
发帖数: 34098
29
shame on M$
加个hint看行不行?

/

【在 i****a 的大作中提到】
: 数据大的话, optimizer 如果认为更高效, 可以选择先对所有行做a/b.
: 我可以在我的数据库反复重现这结果. 刚刚才想起去看看 execution plan. 证明了这
: 个说法.
: 附件. 上面那个没有ROW_NUMBER, 下面有ROW_NUMBER. Compute Scalar 就是计算 a /
: b.

c*****d
发帖数: 6045
30
实验了,还是无法复制出这个问题
你能一次把你的case说明白吗?
哪几个表,哪个字段有0,index在哪几个字段上
语句中x=y是字段x = 字段y ?

【在 i****a 的大作中提到】
: what if you join with another table?
相关主题
query 求助常用SQL的误区???--新手请绕行
求助SQL高手,这个join怎么做比较好Teradata 的大拿呢
请问个join的问题怎样快速得到两个表的交集
进入Database版参与讨论
c*****d
发帖数: 6045
31
虽然我教比软软的数据库nb很多
但是也不能这么瞎黑软软
这个query根本没法加hint
你说在oracle里怎么加hint能跳过predicate直接先对全表处理
类似select 2*id from table where id=1
把全部的id都double一遍之后再看谁符合条件

【在 B*****g 的大作中提到】
: shame on M$
: 加个hint看行不行?
:
: /

B*****g
发帖数: 34098
32
会不会是fetch多少records的问题?
2个query都套上count,看第二个会不会error

【在 c*****d 的大作中提到】
: 虽然我教比软软的数据库nb很多
: 但是也不能这么瞎黑软软
: 这个query根本没法加hint
: 你说在oracle里怎么加hint能跳过predicate直接先对全表处理
: 类似select 2*id from table where id=1
: 把全部的id都double一遍之后再看谁符合条件

i****a
发帖数: 36252
33
SELECT p.product_id
, pp.price / pp.regular_price
FROM product p
INNER JOIN productprice pp ON pp.product_id = p.product_id
WHERE p.type = 1
SELECT p.product_id
, pp.price / pp.regular_price
, ROW_NUMBER() OVER(ORDER BY p.product_id) AS RowNum
FROM product p
INNER JOIN productprice pp ON pp.product_id = p.product_id
WHERE p.type = 1
productprice 表, regular_price有零, 但 inner join p.type = 1 的结果是没有零的

【在 c*****d 的大作中提到】
: 实验了,还是无法复制出这个问题
: 你能一次把你的case说明白吗?
: 哪几个表,哪个字段有0,index在哪几个字段上
: 语句中x=y是字段x = 字段y ?

c*****d
发帖数: 6045
34
create table dbo.product
(product_id int, name varchar(20), type int)
create table dbo.productprice
(product_id int, price int, regular_price int)
insert into dbo.product values(1,'a',1)
insert into dbo.product values(2,'b',2)
insert into dbo.productprice values(1,1,1)
insert into dbo.productprice values(2,2,0)
SELECT p.product_id, pp.price / pp.regular_price discount
FROM product p
INNER JOIN productprice pp ON pp.product_id = p.product_id
WHERE p.type = 1
product_id discount
----------- -----------
1 1
(1 row(s) affected)
c*****d
发帖数: 6045
35
create index ind_p on dbo.product (product_id)
create index ind_pp on dbo.productprice (product_id)
SELECT p.product_id, pp.price / pp.regular_price discount
FROM product p
INNER JOIN productprice pp ON pp.product_id = p.product_id
WHERE p.type = 1
product_id discount
----------- -----------
1 1
(1 row(s) affected)
c*****d
发帖数: 6045
36
drop index ind_p on dbo.product
drop index ind_pp on dbo.productprice
create index ind_p on dbo.product (product_id,type)
create index ind_pp on dbo.productprice(product_id,price,regular_price)
SELECT p.product_id, pp.price / pp.regular_price discount
FROM product p
INNER JOIN productprice pp ON pp.product_id = p.product_id
WHERE p.type = 1
product_id discount
----------- -----------
1 1
(1 row(s) affected)
c*****d
发帖数: 6045
37
drop index ind_p on dbo.product
drop index ind_pp on dbo.productprice
create index ind_p on dbo.product (type)
create index ind_pp on dbo.productprice (price,regular_price)
SELECT p.product_id, pp.price / pp.regular_price discount
FROM product p
INNER JOIN productprice pp ON pp.product_id = p.product_id
WHERE p.type = 1
product_id discount
----------- -----------
1 1
(1 row(s) affected)
i****a
发帖数: 36252
38
也顷□痗q的问题. 你看我贴的 execution plan 就是这两个 query 的

【在 c*****d 的大作中提到】
: drop index ind_p on dbo.product
: drop index ind_pp on dbo.productprice
: create index ind_p on dbo.product (type)
: create index ind_pp on dbo.productprice (price,regular_price)
: SELECT p.product_id, pp.price / pp.regular_price discount
: FROM product p
: INNER JOIN productprice pp ON pp.product_id = p.product_id
: WHERE p.type = 1
: product_id discount
: ----------- -----------

j*r
发帖数: 17
39
我碰到这种问题,都给分母加个数,比如
a/(b+0.00000001)
1 (共1页)
进入Database版参与讨论
相关主题
请教一个mysql 排序问题。菜鸟问.asp 里的select语句在基于SQL sever和Access语法上的不
random sampling with replacement, how?MySQL语句请教
query 求助请教:如何优化,提取组间最大行
求助SQL高手,这个join怎么做比较好Urgent SQL problem!
请问个join的问题Re: 用Servlet显示数据库里的数据,分页的? (答案在这里)
常用SQL的误区???--新手请绕行how to fetch the first record from a table?
Teradata 的大拿呢数据库问题求解
怎样快速得到两个表的交集To get the 2nd, 3rd, 4th largest value
相关话题的讨论汇总
话题: select话题: where话题: product话题: row话题: index