我有两张桌子。
T1
IDWorker
名称
姓氏
T2
IDWorker
月
年
因子
现在我必须让所有未在T2中的工人在给定的月份和年份。
这是我的疑问:
SELECT
`T1`.`IDWorker`,
`T1`.`Name`,
`T1`.`LastName`,
`T2`.`Month`,
`T2`.`Year`
`T2`.`Factor`
FROM
`T1`
LEFT JOIN `T2` ON `T1`.`IDWorker` = `T2`.`IDWorker`
WHERE
`T2`.`Month` = 4 AND
`T2`.`Year` = 2014 AND
`T2`.`IDWorker` IS NULL;
运行此查询我得到空结果,但不包括月份和年份标准我得到工人列表。我需要的结果显示所有未在T2期间进入T2的工人。
答案 0 :(得分:1)
我愿意
SELECT * FROM t1
WHERE IDWorker NOT IN (SELECT IDWorker
FROM T2
WHERE Month = 4
AND Year = 2014)
答案 1 :(得分:1)
尝试使用NOT EXISTS
SELECT
`t`.`IDWorker`,
`t`.`Name`,
`t`.`LastName`,
`T2`.`Month`,
`T2`.`Year`
`T2`.`Factor`
FROM
`T1` t
WHERE NOT EXISTS
(
SELECT 1 FROM `T2`
WHERE
`T2`.`Month` = 4 AND
`T2`.`Year` = 2014 AND
`t`.`IDWorker` = `T2`.`IDWorker`
)
或者在ON()
子句
SELECT
`T1`.`IDWorker`,
`T1`.`Name`,
`T1`.`LastName`,
`T2`.`Month`,
`T2`.`Year`
`T2`.`Factor`
FROM
`T1`
LEFT JOIN `T2` ON `T1`.`IDWorker` = `T2`.`IDWorker` AND
`T2`.`Month` = 4 AND
`T2`.`Year` = 2014
WHERE
`T2`.`IDWorker` IS NULL;
还要通过LEFT JOIN / IS NULL vs. NOT IN vs. NOT EXISTS: nullable columns了解效果因素
答案 2 :(得分:0)
您的查询T2.IDWorker IS NULL
限制了T2记录的集合,这些记录只能转到左边的IDWorker = NULL
。解决它的方法是创建一个子查询,首先进行连接,然后对结果应用过滤器,即:
SELECT IDWorker, Name, LastName
FROM (SELECT
T1.IDWorker,
T1.Name,
T1.LastName,
T2.IDWorker 'IDWorker2'
FROM
T1 LEFT JOIN T2 ON T1.IDWorker = T2.IDWorker
WHERE
T2.Month = 4 AND
T2.Year = 2014) subquery
WHERE IDWorker2 IS NULL
注意:由于T2中的记录不会存在于最终结果中,因此无法尝试打印月,年和因子的空值,因此我将其删除
sdespoint建议的解决方案也可以工作,但(特别是对于支持IDWorker
索引的大型数据集,可能会遇到比上述选项更差的性能。