首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

两句SQL话语的对比,不知道为什么错了

2013-06-19 
两句SQL语句的对比,不知道为什么错了这个是第一个语句:SELECT* from T_CarInfowhere T_CarInfo.CarID not

两句SQL语句的对比,不知道为什么错了
这个是第一个语句:
SELECT  * from T_CarInfo
where T_CarInfo.CarID not in (
            SELECT 
    T_RepairBill.CarID
            FROM 
T_RepairBillRepairType 
LEFT JOIN T_RepairBill 
ON T_RepairBillRepairType.RepairBillCode = T_RepairBill.RepairBillCode AND T_RepairBillRepairType.PointCode = T_RepairBill.PointCode
LEFT JOIN T_ComParameter
ON T_RepairBillRepairType.RepairType=T_ComParameter.ParameterFlag and T_RepairBillRepairType.PointCode=T_ComParameter.PointCode
where  T_ComParameter.MaintenanceFlag=1
AND
(T_RepairBillRepairType.PointCode IN (SELECT PointCode FROM DBO.F_GetRelationPointCollection('0', 1, 1, -1 * ISNULL(0, 0), 1)))

 and (T_CarInfo.PointCode IN (SELECT PointCode FROM DBO.F_GetRelationPointCollection('0', 1, 1, -1 * ISNULL(0, 0), 1)))

 这个是第二个语句:
 SELECT  * from T_CarInfo
    where NOT exists(
        SELECT  
      1
            FROM 
T_RepairBillRepairType
LEFT JOIN T_RepairBill 
ON T_RepairBillRepairType.RepairBillCode = T_RepairBill.RepairBillCode AND T_RepairBillRepairType.PointCode = T_RepairBill.PointCode
LEFT JOIN T_ComParameter
ON T_RepairBillRepairType.RepairType=T_ComParameter.ParameterFlag and T_RepairBillRepairType.PointCode=T_ComParameter.PointCode
where  T_ComParameter.MaintenanceFlag=1 
AND T_RepairBill.CarID=T_CarInfo.CarID
AND
(T_RepairBillRepairType.PointCode IN (SELECT PointCode FROM DBO.F_GetRelationPointCollection('0', 1, 1, -1 * ISNULL(0, 0), 1)))
        )
        and (T_CarInfo.PointCode IN (SELECT PointCode FROM DBO.F_GetRelationPointCollection('0', 1, 1, -1 * ISNULL(0, 0), 1)))
查询出来的结果无疑第二句是正确的,第一句是空的。
我不明白的是第一个语句与第二个语句所要表达的意义是一样的,都是排除T_ComParameter.MaintenanceFlag=1 
这种情况下的数据信息。为什么第一个语句查询的是空的呢?求高手解答
[解决办法]
T_RepairBill.CarID
里有null值存在是导致查不到结果的原因
[解决办法]
这样应该ok的
SELECT  * from T_CarInfo
where T_CarInfo.CarID not in (
            SELECT 
    T_RepairBill.CarID
            FROM 
T_RepairBillRepairType 
LEFT JOIN T_RepairBill 
ON T_RepairBillRepairType.RepairBillCode = T_RepairBill.RepairBillCode AND T_RepairBillRepairType.PointCode = T_RepairBill.PointCode


LEFT JOIN T_ComParameter
ON T_RepairBillRepairType.RepairType=T_ComParameter.ParameterFlag and T_RepairBillRepairType.PointCode=T_ComParameter.PointCode
where  T_ComParameter.MaintenanceFlag=1
AND
(T_RepairBillRepairType.PointCode IN (SELECT PointCode FROM DBO.F_GetRelationPointCollection('0', 1, 1, -1 * ISNULL(0, 0), 1)))

 and (T_CarInfo.PointCode IN (SELECT PointCode FROM DBO.F_GetRelationPointCollection('0', 1, 1, -1 * ISNULL(0, 0), 1))
 and T_RepairBill.CarID is not null
 )

[解决办法]
运行一下not in 子句和NOT exists 子句里面的结果集是否一样。。。
第二个子句中 多了一个条件 AND T_RepairBill.CarID=T_CarInfo.CarID 有了这个条件后 left join 等价与inner join  
[解决办法]
关于Not In与 Not Exists的区别SqlServer技术内幕2008里有说到,楼主可以去看看这本书。
大概是这样:当T_RepairBill.CarID 有null时,In谓词总是要么返回True,要么返回Unknown,相应Not In总是返回Not true或者 Not Unknown,都不会是True,所以返回空。而Exists不会出现这种情况。

热点排行