要查询数据库中出现异常的数据,因为两种查询方式查询出来的结果有可能不一样.查询某客户最大编号的一张发票的id,第一种查询方法
select top 1 id from purchase_customer_balance where right(invoice_no,5) = '-' + datename(yy,getdate()) and customer_code='135' order by cast(parsename(replace(invoice_no , '-' , '.'),2) as int)  desc 第二种查询方式,是查询最后生成的id,如下
select top 1 id from purchase_customer_balance where  customer_code='135' order by id desc按理说,以上两种方法查询出来的结果都是一样的,但是程序上可能有漏洞,造成了有的客户的结果不一样,怎样吧两者的查询结果不一样的数据列出来呢? 我想用exsit或者not in这样的语句来查询,但是发现以上两种方法都是指定了具体的客户名称的(customer_code='135'),查询结果都只是一条数据,我要查询所有客户,而不是指定的某个客户,现在搞头晕了,怎样写啊?

解决方案 »

  1.   

    按理说?
    你这是两个完全不同的查询语句,何来查询结果一样之说!
    select top 1 id 
    from purchase_customer_balance 
    where right(invoice_no,5) = '-' + datename(yy,getdate()) and customer_code='135' 
    order by cast(parsename(replace(invoice_no , '-' , '.'),2) as int)  desc 
    select top 1 id 
    from purchase_customer_balance 
    where  customer_code='135'
    order by id desc要使它两的查询结果一样,首先,对任何一个记录,都必须满足
    right(invoice_no,5) = '-' + datename(yy,getdate())
    其次,你必须保证
    cast(parsename(replace(invoice_no , '-' , '.'),2) as int)
    与 id 的顺序完全一样,兄弟,你是如何保证的?
      

  2.   

    这个编号的生成是有一定规则,由程序控制的,客户编号的格式是  "客户代码-年份" 这样的格式,例如“jacky-35-2011”,程序在生成编号方面是没有问题.  第一种查询方法是查询发票号码最大的哪一条记录,而第二种方法是查询最后一个id,也就是说,我设计的是最后一张发票肯定是最后一个生成的,也就是说id号肯定是最大的哪一个,所以虽然我那两种查询方法从逻辑上说确实如你所说,并不能保证,但是这些数据都是程序生成的,程序保证了这个是没有问题的. 当然我现在说程序也存在问题并不是这个问题,而是别的问题,造成了数据上的错误.我现在想找出来有问题的数据,是想从数据上分析一下问题在哪里?
      

  3.   

    好的,就算你的where条件能够保证,而你生成 invoice_no 的算法,你认为它应该与 id 保持一致的顺序,可是,事实证明它们并非同一顺序.
    我们都不知道你的程序逻辑,是没法帮你排查的,有一个建议,对这两条语句,你不要 top 1 id,可以考虑 select id ,甚至用 select * 来根据两种不同的排序方式把数据列出来,看一看本该放在最后的那条记录,究竟放到哪儿去了,这才能进一步找出为什么它不在最后一条的原因.
      

  4.   

    是啊,我也是这个想法,但我现在不知道究竟那个客户的数据有问题啊,如果我知道了,就是不知道,才要先查询出来有问题的客户,找到了客户名单之后,我在用select * where 这个客户的方式去列出数据分析问题啊
      

  5.   

    我现在就是不知道怎样把那两条sql语句合成一条查询语句,列出两者查询结果不同的id,或者客户编号也行.
      

  6.   

    为什么要合成一条语句呢:
    select top 10 * 
    from purchase_customer_balance 
    where right(invoice_no,5) = '-' + datename(yy,getdate()) and customer_code='135' 
    order by cast(parsename(replace(invoice_no , '-' , '.'),2) as int)  desc 
    select top 10 * 
    from purchase_customer_balance 
    where  customer_code='135'
    order by id desc我估计各用前10 条语句对比,就能找出原因来.
      

  7.   

    这样查不出来的,因为并不是每个客户都会出现问题的,而是几百个客户中会有个别客户偶尔出现问题,而出现问题都是在最后一张发票的号码上面.
    也就是说我们客户的发票号码如下:
    jacky-37-2011
    jacky-36-2011
    jacky-35-2011
    ...从以上可以看出来,发票号最大的那个肯定是最后生成的,也就是第二种查询方法查出来得,但是现在发现最后一个发票的id竟然不是最后的情况,这当然是程序问题,是因为程序造成了数据的问题. 所以才想出来用第一种查询语句来查询,和第二种查询语句对比,来找出有问题的客户的发票