两句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不会出现这种情况。