SQL语句报错:Operand type clash: date与int不兼容(NOT IN子查询)
解决Operand type clash: date is incompatible with int报错
这个类型冲突错误的原因特别直接:你在外层查询里用B.ContactID(整数类型)去和子查询返回的B.DepartureDate(日期类型)做比较,这俩数据类型完全不兼容,数据库肯定会抛出Operand type clash的错误。
问题根源分析
原SQL的NOT IN子查询写的是SELECT B.DepartureDate FROM Booking B WHERE B.DepartureDate >= '2018-04-26',但你的实际需求应该是排除那些有DepartureDate晚于2018-04-26的预订的ContactID,所以子查询应该返回ContactID而不是DepartureDate。
修正后的SQL
只需要把子查询里的返回字段从B.DepartureDate改成B.ContactID就可以解决问题,完整代码如下:
SELECT Br.BusinessDivision, B.BookingDate, B.DepartureDate, B.CustomerID, C.FirstName, C.SurName FROM Booking B INNER JOIN Customer C ON C.ContactID = B.ContactID INNER JOIN Branch Br ON Br.BranchID = B.BranchID WHERE B.BookingDate BETWEEN '2015-04-01' AND '2018-04-26' AND Br.BusinessDivision IN ( 'Retail', 'TVSales' ) AND B.ContactID NOT IN ( SELECT B.ContactID -- 替换为正确的字段 FROM Booking B WHERE B.DepartureDate >= '2018-04-26' );
更可靠的替代方案:使用NOT EXISTS
如果你的Booking表中ContactID可能存在NULL值,NOT IN会因为NULL的存在导致整个条件失效(因为任何值和NULL比较都返回未知)。这种情况下,推荐用NOT EXISTS来替代,逻辑更清晰也更稳定:
SELECT Br.BusinessDivision, B.BookingDate, B.DepartureDate, B.CustomerID, C.FirstName, C.SurName FROM Booking B INNER JOIN Customer C ON C.ContactID = B.ContactID INNER JOIN Branch Br ON Br.BranchID = B.BranchID WHERE B.BookingDate BETWEEN '2015-04-01' AND '2018-04-26' AND Br.BusinessDivision IN ( 'Retail', 'TVSales' ) AND NOT EXISTS ( SELECT 1 -- 这里用SELECT 1比SELECT字段更高效 FROM Booking B2 WHERE B2.ContactID = B.ContactID -- 关联外层的ContactID AND B2.DepartureDate >= '2018-04-26' );
这里给子查询的表起了别名B2,避免和外层的B混淆,逻辑是“不存在同一个ContactID的预订,其DepartureDate晚于2018-04-26”,和原需求完全匹配,同时规避了NULL的问题。
内容的提问来源于stack exchange,提问作者user7774424
相关产品推荐
相关产品推荐

