select * from A where exists
(
select * from B where B.MenuID=A.MenuID and checksum(newid())>0
)我的理解是:每次执行这个sql语句出来的结果条数应该都不一样。可是实际情况是每次结果条数都一样,或者一条都没有。子查询中不是有个newid()的吗,为什么结果条数还是一样的呢?
(
select * from B where B.MenuID=A.MenuID and checksum(newid())>0
)我的理解是:每次执行这个sql语句出来的结果条数应该都不一样。可是实际情况是每次结果条数都一样,或者一条都没有。子查询中不是有个newid()的吗,为什么结果条数还是一样的呢?
(
select * from B where B.MenuID=A.MenuID and checksum(newid())>0
)
--#1.因为你用的是exists.^^
--#2.试试:
SELECT TOP(ABS(checksum(newid()))%100) * --#3.当然了,至于是%100,还是%10,还是其它值自己把握
FROM A, B
WHERE A.MenuID = B.MenuID
(
select * from B where B.MenuID=A.MenuID and checksum(newid())>0
)
--分析如下:
--#1.select * from B where B.MenuID=A.MenuID 这个SQL返回值固定,忽略它,则变成:
select * from A where exists
(
checksum(newid())>0
)
--#2.SQL有一个原则,当你运行上面的SQL时,checksum对所有的记录只会计算一次.则变成:
select * from A where exists
(
true --or false
)
--#3.所以结果:每次结果条数都一样,或者一条都没有
--#2.SQL有一个原则,当你运行上面的SQL时,checksum对所有的记录只会计算一次.则变成:这个原则的原话是怎么样的
select checksum(newid()),* from dbo.tb_Library where checksum(newid())>0
结果集要么所有记录都显示,要么一条也不显示,
而且都即使是都显示时,第一列也就是checksum(newid())此列,其值也是有小于零的,
按理说where checksum(newid())>0,这些记录是不应该出来的,
和楼主一样迷惑啊,等高手
是不是newid()在子查询中只返回一个相同的值,不会返回随机不同的值???
--#2.SQL有一个原则,当你运行上面的SQL时,checksum对所有的记录只会计算一次
我理解为:只要第一条记录的checksum(newid())>0,
那么所有的记录就已经满足where checksum(newid())>0此条件,显示所有记录,
如果第第一条记录的checksum(newid())<0,则不显示任何一条记录
自以为事,也不知道对不对?
而且都即使是都显示时,第一列也就是checksum(newid())此列,其值也是有小于零的
因为第一列从新去取newid值了,所以会有小于0的。
select * from A where substring(convert(nvarchar(50),newid()),1,1) in('1','2','3','4','5','6','7','8','9','0')
其实你的语句的效果,就是2种状态select * from A where exists
(
select * from B where B.MenuID=A.MenuID and 1>0
)或者
select * from A where exists
(
select * from B where B.MenuID=A.MenuID and -1>0
)---可是实际情况是每次结果条数都一样,或者一条都没有。出第一种,结果是固定的 --> 每次结果条数都一样
出第二种,就是没有结果 --> 或者一条都没有
只考虑第一次执行的情况(对应第一条记录),满足则全部显示,不满足则一条也不显示
select * from A where exists
(
select * from B where B.MenuID=A.MenuID and checksum(newid())>0
)===可以这么弄
select *,checksum(newid()) B INTO #T from B
select * from A where exists
(
select * from #T B where B.MenuID=A.MenuID and B>0
)刚也测试了一下,看了执行计划NEWID根本没过滤数据,要不然就是0条,但保存后是可以比较的
这个语句是一个嵌套的SQL语句。
首先看里层的select * from B where B.MenuID=A.MenuID and checksum(newid())>0语句,checksum(newid())每次执行时生成一个随机数,所以有时checksum(newid())>0成立,有时不成立,所以里层的的SQL语句有时会有结果,有时为空集;
其次再看exists语句,存在语句跟Where 1 = 1(True)或者Where 1 <> 1(False)效果相同;
最后我们看外层SQL自行的情况,执行时会出现select * from A where 1 = 1 或者 select * from A where 1 <> 1两种结果;
所以查询结果要么就是A的所有记录,要么就是空集。怎么会“每次执行这个sql语句出来的结果条数应该都不一样”呢?
单独一条sql语句随机排序是可以的。但是
select * from T_OrderForm where OrderId in (select top 10 OrderID from dbo.T_OrderAmend order by newid())
这条sql语句,我的理解是它不应该只查到10条记录吧?order by newid() 每次查询都不一样的,所以结果应该会超过10条吧,除非newid()只有一个值才是对的
那10条是每次查询的10条可能会不一样
select top 10 OrderID from dbo.T_OrderAmend order by newid() 这个子查询只查询一次吗?
不会根据主表来执行多次??我的理解是: 主表中有多少条记录,这个子查询就查询多少次。