如何从第二个表中不存在的一个表中选择记录

时间:2014-05-09 06:46:49

标签: mysql join

我有两张桌子。

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的工人。

3 个答案:

答案 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()子句

中添加表2的where条件的其他方法
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索引的大型数据集,可能会遇到比上述选项更差的性能。