select * from A where exists
(
select * from B where B.MenuID=A.MenuID and checksum(newid())>0
)我的理解是:每次执行这个sql语句出来的结果条数应该都不一样。可是实际情况是每次结果条数都一样,或者一条都没有。子查询中不是有个newid()的吗,为什么结果条数还是一样的呢?

解决方案 »

  1.   

    select * from A where exists
    (
    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
      

  2.   

    select * from A where exists
    (
        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.所以结果:每次结果条数都一样,或者一条都没有
      

  3.   


    --#2.SQL有一个原则,当你运行上面的SQL时,checksum对所有的记录只会计算一次.则变成:这个原则的原话是怎么样的
      

  4.   

    我连续执行下面这条语句
    select checksum(newid()),* from dbo.tb_Library where checksum(newid())>0
    结果集要么所有记录都显示,要么一条也不显示,
    而且都即使是都显示时,第一列也就是checksum(newid())此列,其值也是有小于零的,
    按理说where checksum(newid())>0,这些记录是不应该出来的,
    和楼主一样迷惑啊,等高手
      

  5.   


    是不是newid()在子查询中只返回一个相同的值,不会返回随机不同的值???
      

  6.   

    根据2楼说的情况:
    --#2.SQL有一个原则,当你运行上面的SQL时,checksum对所有的记录只会计算一次
    我理解为:只要第一条记录的checksum(newid())>0,
    那么所有的记录就已经满足where  checksum(newid())>0此条件,显示所有记录,
    如果第第一条记录的checksum(newid())<0,则不显示任何一条记录
    自以为事,也不知道对不对?
      

  7.   


    而且都即使是都显示时,第一列也就是checksum(newid())此列,其值也是有小于零的

    因为第一列从新去取newid值了,所以会有小于0的。
      

  8.   

    不应该说是 checksum() 只执行一次啊?,现在没有checksum()也是一样的效果?要么全有,要么全无
    select * from A where substring(convert(nvarchar(50),newid()),1,1) in('1','2','3','4','5','6','7','8','9','0')
      

  9.   

    問題不在checksum(),在於newid(),我感覺newid()放在條件中只會有一個值
      

  10.   

    首先要明白exists,它返回的true or false
    其实你的语句的效果,就是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
    )---可是实际情况是每次结果条数都一样,或者一条都没有。出第一种,结果是固定的 --> 每次结果条数都一样
    出第二种,就是没有结果 --> 或者一条都没有
      

  11.   

    综合所看,可能还是如我在6楼的猜测,对于newid()或checksum(newid()),
    只考虑第一次执行的情况(对应第一条记录),满足则全部显示,不满足则一条也不显示
      

  12.   


    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条,但保存后是可以比较的
      

  13.   


    这个语句是一个嵌套的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语句出来的结果条数应该都不一样”呢?
      

  14.   

    newid()放在條件中只會有一個值。是不是这样的??
      

  15.   

    没有具体文档资料,不能这么说,猜想是这样的,但排序ORDER BY NEWID()是的确可以随机排序的,这样貌似又不是一个值直接利用NEWID()当条件却没起作用,固定后再比较是能起作用的可以利用上面我说的,先固定查询好了后再删除临时表
      

  16.   


    单独一条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()只有一个值才是对的
      

  17.   

    如果你ORDERID唯一,你会小于等于10条,不唯一,可能就会》10了,
    那10条是每次查询的10条可能会不一样
      

  18.   


    select top 10 OrderID from dbo.T_OrderAmend order by newid()  这个子查询只查询一次吗?
    不会根据主表来执行多次??我的理解是: 主表中有多少条记录,这个子查询就查询多少次。