查找两个选择查询的交集

时间:2017-06-05 12:24:01

标签: mysql sql

我需要在MYSQL中找到以下查询之间的交集

SELECT * 
FROM project.backup_table 
where project.backup_table.date <= (SELECT date FROM project.main_inout_table  ORDER BY date desc LIMIT 1) 
    and project.backup_table.date >= (SELECT date FROM project.main_inout_table  ORDER BY date asc LIMIT 1)  

SELECT *
FROM project.backup_table
WHERE concat(empid,date) not IN (SELECT concat(empid,date) FROM project.main_inout_table

表格是:

maintable

backuptable

我的尝试:

SELECT * FROM project.backup_table
where project.backup_table.date <= (SELECT date FROM project.main_inout_table
                                    ORDER BY date desc LIMIT 1) and project.backup_table.date >= (SELECT date FROM project.main_inout_table
                                                                      ORDER BY date asc LIMIT 1)  and exists (SELECT * FROM project.backup_table
                                                                        WHERE concat(empid,date) not IN (SELECT concat(empid,date)
                                                                         FROM project.main_inout_table));

问题: tid 4的详细信息是否应该被第二个选择查询过滤掉?

1 个答案:

答案 0 :(得分:0)

交叉点是满足两个条件的行。所以,只需将条件结合在一起:

SELECT bt.* 
FROM project.backup_table bt
WHERE bt.date <= (SELECT MAX(date) FROM project.main_inout_table mit) AND
      bt.date >= (SELECT MIN(date) FROM project.main_inout_table mit) AND
      NOT EXISTS (SELECT 1
                  FROM project.main_inout_table mit
                  WHERE mit.empid = bt.empid AND mit.date = bt.date
                 );

请注意以下更改:

  • 表中给出了别名,它们是表名的缩写。
  • 这些列都使用表别名限定。
  • 前两个子查询只使用MIN()MAX()。这些可以合并为一个子查询或连接,但这符合您的原始配方。
  • 最后一个子查询使用EXISTS而不是CONCAT()。实际上,这也可以使用IN和元组(MySQL支持的东西,但不是所有数据库)。