您好我的查询有问题,它显示的数据正确但数量不正确(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);
请有人帮助我吗?
答案 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”,所以
至少尝试发布一个有效的查询,因为您似乎表明它有效(并返回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);