2012-02-08 108 views
0

我想从两个MySql表中选择记录。我希望第一张表中的所有记录(不包括按日期的特定记录)从第二张表中排除。例如:SQL查询从一个表中获取所有记录,除了特定记录,按日期,从另一个表

表1T1idfirstNameLastName
表2idT1idhoursratedate

T1id是这两个表之间的链接,因此当表的连接我有T1idfirstNamelastName,hours,rate, date

假设有一个记录表2date of 2012-02-08。随着一个查询,我需要从表1 选择的所有记录,不包括表2是拥有2012-02-08日期的记录。

我已经尝试了JOINS和UNION的一些变体,但是我得到所有记录,一堆重复记录或一个记录(即Table2日期)。我很抱歉,但是我没有特定的代码片段,因为没有任何东西适用于我。

回答

1

很多次,这通常是用NOT EXISTS子查询完成的,但子查询可以是大表中的大性能命中......但是,通过执行LEFT JOIN并寻找N ULL是在本质上相同的结果

select 
     t1.* 
    from 
     table1 t1 
     left join table2 t2 
      on t1.t2.t1id 
      AND t2.date = '2012-02-08' 
    where 
     t2.t1id IS NULL 
+0

我刚刚在我的查询和中提琴中使用了你的建议,它工作。通过具有“及日期”日Thnx – user175328 2012-02-08 12:53:01

+0

@ user175328,很高兴它的工作... - 我真的试图包含在你的建议都分开,但没想到把它放在一起(即LEFT JOIN和日期,以及IS NULL)与加入素质要求在特定的水平,而不是整个“WHERE”条款有关......绝招我已经学会在左边好半天回JOIN/NULL测试......特别是如果工作表符合MIL记录比子 - 为每个被测试的行选择。 – DRapp 2012-02-08 12:59:28

1

使用INNER JOIN如果你确信T1id存在两个表中:

SELECT a.T1id, 
     a.FirstName, 
     a.LastName, 
     b.hours, 
     b.rate, 
     b.date 
FROM table1 a INNER JOIN table2 b 
     ON a.T1id = b.T1id 
WHERE b.date <> DATE('2012-02-08') 

,但如果你想从表1 (现有的或表2中不存在),让所有T1id使用LEFT JOIN

SELECT a.T1id, 
     a.FirstName, 
     a.LastName, 
     b.hours, 
     b.rate, 
     b.date 
FROM table1 a LEFT JOIN table2 b 
     ON a.T1id = b.T1id 
WHERE b.date <> DATE('2012-02-08') 
+0

日Thnx的快速反应。不幸的是,这两个建议都导致Table2中的所有记录都没有2012-02-08的日期。我试图从Table1中获取所有记录,减去Table2 2012-02-08记录。 – user175328 2012-02-08 12:45:01

相关问题