SQL Count(*)不显示正确的数据

时间:2011-01-16 08:15:38

标签: sql

您好我的查询有问题,它显示的数据正确但数量不正确(count(*))。不知何故,它应该为该部分显示数据1,但它显示4。 我不知道错误在哪里。

select Vehical_Type, 
       Vehical_Registration_No, 
       count(*) 
from van, 
     van_booking 
where Vehical_Type = 'Ford - Transit' 
  and Vehical_Registration_No <> fk2_Vehical_Registration_No 
         not in (select fk2_Vehical_Registration_No 
                 from van_booking 
                 where '2010.10.12' between Hire_Start_Date and Hire_End_Date 
                    or '2010.10.11' between Hire_Start_Date and Hire_End_Date);

请有人帮助我吗?

3 个答案:

答案 0 :(得分:3)

请注意,count (*)将显示包含NULLS的计数,其中count(fieledName)将显示计数而不会 NULLS。你应该选择合适的选项。

答案 1 :(得分:3)

假设你的DBMS允许缺少GROUP BY,而带有NOT IN的无效表达只是一个副本&amp;粘贴错误,我说你的问题是缺少连接。

您没有将van加入van_booking,因此该语句会生成这些表的笛卡尔积。含义来自van的每个行都会加入van_booking每个行,这很可能不是您想要的。

我想你会想要这样的东西:

FROM van
  JOIN van_booking ON van.id = van_booking.van_id

正确加入这两个表。

答案 2 :(得分:2)

我们从哪里开始?

select Vehical_Type, Vehical_Registration_No, count(*)
from van, van_booking
where Vehical_Type = 'Ford - Transit'
  and Vehical_Registration_No <> fk2_Vehical_Registration_No
**not in (**
  select fk2_Vehical_Registration_No
  from van_booking
  where '2010.10.12' between Hire_Start_Date and Hire_End_Date
     or '2010.10.11' between Hire_Start_Date and Hire_End_Date);

由于NOT IN之前没有“AND”,所以

  1. 没有关于它是对还是错的背景
  2. 查询甚至不会运行
  3. 至少尝试发布一个有效的查询,因为您似乎表明它有效(并返回count =&gt; 4)。

    其次,请为表名添加别名,以便您可以在列前添加别名。目前,关于哪些列属于哪些表格是不明确的。

    第三,我猜这是MySQL?您应该始终说明您正在使用哪个DBMS,但MySQL是唯一可以让您通过 MIXING 聚合和非聚合字段没有 GROUP BY子句的方法

    第四,请尝试学习使用SQL92 ANSI连接而不是旧式交叉连接和过滤器在WHERE中。看起来你已经越过了Van和Van_Booking表而没有任何关联子句。你想要实现什么目标?

    最后,这与最后一点有关,根据该样本数据列出一些示例数据行以及结果应该是什么样的内容将会非常有用。

    我猜你实际上所追求的是所请求类型的车辆登记号码列表,但同时,在COUNT列中,显示...与查询匹配的记录总数?那么,这样的事情呢?

    Type | Registration | Count
    Ford - Transit | ABC123 | 4
    Ford - Transit | D4 | 4
    Ford - Transit | XY13 | 4
    Ford - Transit | PQS333 | 4
    

    这只是一个猜测,但没有计数,你可以使用这个

    select Vehical_Type, Vehical_Registration_No
    from van
    where Vehical_Type = 'Ford - Transit'
      and Vehical_Registration_No not in (
      select fk2_Vehical_Registration_No
      from van_booking
      where '2010.10.12' between Hire_Start_Date and Hire_End_Date
         or '2010.10.11' between Hire_Start_Date and Hire_End_Date);
    

    要包含计数(在所有行中都是相同的值),您可以将查询复制为自身的子查询

    select Vehical_Type, Vehical_Registration_No, C.C
    from van
    cross join (
        select COUNT(*) C
        from van
        where Vehical_Type = 'Ford - Transit'
          and Vehical_Registration_No not in (
          select fk2_Vehical_Registration_No
          from van_booking
          where '2010.10.12' between Hire_Start_Date and Hire_End_Date
             or '2010.10.11' between Hire_Start_Date and Hire_End_Date)) C
    where Vehical_Type = 'Ford - Transit'
      and Vehical_Registration_No not in (
      select fk2_Vehical_Registration_No
      from van_booking
      where '2010.10.12' between Hire_Start_Date and Hire_End_Date
         or '2010.10.11' between Hire_Start_Date and Hire_End_Date);