从b中不存在的mysql select *

时间:2013-09-30 12:07:06

标签: mysql sql

我遇到了构建查询的问题,该查询过滤了表a中已经存在于表b中的帖子。

表A:

 `bok_id` int(6) NOT NULL AUTO_INCREMENT,
 `tid` time NOT NULL,
 `datum` date NOT NULL,
 `datum_end` date NOT NULL,
 `framtid` varchar(5) NOT NULL,
 `h_adress` varchar(100) NOT NULL,
 `l_adress` varchar(100) NOT NULL,
 `kund` varchar(100) NOT NULL,
 `typ` varchar(5) NOT NULL,
 `bil` varchar(99) NOT NULL,
 `sign` varchar(2) NOT NULL,
 `tilldelad` varchar(12) NOT NULL,
 `skapad` datetime NOT NULL,
 `endrad` datetime NOT NULL,
 `endrad_av` varchar(2) NOT NULL,
 `kommentar` text NOT NULL,
 `weektype` varchar(3) NOT NULL,
 `Monday` tinyint(1) NOT NULL,
 `Tuesday` tinyint(1) NOT NULL,
 `Wednesday` tinyint(1) NOT NULL,
 `Thursday` tinyint(1) NOT NULL,
 `Friday` tinyint(1) NOT NULL,
 `Saturday` tinyint(1) NOT NULL,
 `Sunday` tinyint(1) NOT NULL,
 `avbokad` varchar(2) NOT NULL,
 `unika_kommentarer` varchar(2) NOT NULL,
 UNIQUE KEY `bok_id` (`bok_id`)

表B:

 `id` int(6) NOT NULL AUTO_INCREMENT,
 `bok_id` int(6) NOT NULL,
 `tid` time NOT NULL,
 `datum` date NOT NULL,
 `datum_end` date NOT NULL,
 `framtid` varchar(5) NOT NULL,
 `h_adress` varchar(100) NOT NULL,
 `l_adress` varchar(100) NOT NULL,
 `kund` varchar(100) NOT NULL,
 `typ` varchar(5) NOT NULL,
 `bil` varchar(99) NOT NULL,
 `sign` varchar(2) NOT NULL,
 `tilldelad` varchar(12) NOT NULL,
 `skapad` datetime NOT NULL,
 `endrad` datetime NOT NULL,
 `endrad_av` varchar(2) NOT NULL,
 `kommentar` text NOT NULL,
 `weektype` varchar(3) NOT NULL,
 `Monday` tinyint(1) NOT NULL,
 `Tuesday` tinyint(1) NOT NULL,
 `Wednesday` tinyint(1) NOT NULL,
 `Thursday` tinyint(1) NOT NULL,
 `Friday` tinyint(1) NOT NULL,
 `Saturday` tinyint(1) NOT NULL,
 `Sunday` tinyint(1) NOT NULL,
 `avbokad` varchar(2) NOT NULL,
 `unika_kommentarer` varchar(2) NOT NULL,
 UNIQUE KEY `id` (`id`)

我想要的是一个隐藏表A中所有行的查询,该表存在于表B中。表B.tilldelad =请求日期。 (f.e 2013-09-30)

我不确定这有什么意义吗?

我想要的是过滤掉已经执行的期间预订,因此存在于表b中,表明它已经存在。

由于其重复发生的事件,同一个bok_id在表B中可以存在几次,但在表A中只有ONCE ...

SELECT * FROM bokningar 
WHERE bokningar.datum <= '2013-09-30' 
AND bokningar.datum_end >= '2013-09-30' 
AND bokningar.typ >= '2' 
AND bokningar.weektype = '1' 
AND bokningar.Monday = '1' ## Monday this is dynamically changed to current date 
AND bokningar.avbokad < '1' 
AND NOT EXISTS ( SELECT 1 FROM tilldelade WHERE tilldelade.tilldelad = '2013-09-30' )

上面的代码解决了过滤不在表B中的行的问题,但是,如果表B中的一行具有当前日期,则过滤掉所有结果。 只有具有相应bok_id的行才会被过滤掉。

有关如何做到这一点的任何想法?也许是一个独特的选择?

3 个答案:

答案 0 :(得分:2)

尝试类似

的内容
SELECT ...
FROM TABLEA
WHERE TABLEA.tilldelad=Requested Date
AND NOT EXISTS (SELECT 1 FROM TABLEB 
                WHERE TABLEB.tilldelad=Requested Date
                  AND TABLEA.bok_id = TABLEB.bok_id
                  AND...)

答案 1 :(得分:2)

通常,NOT IN子选择在查询时非常昂贵。这通常可以通过执行LEFT-JOIN并仅保留其他表为空的那些来处理...

SELECT * 
   FROM 
      bokningar 
         LEFT JOIN tilldelade 
            on bokningar.bok_id = tilldelade.bok_id
           AND tilldelade.tilldelad = '2013-09-30'
   WHERE 
          bokningar.datum <= '2013-09-30' 
      AND bokningar.datum_end >= '2013-09-30' 
      AND bokningar.typ >= '2' 
      AND bokningar.weektype = '1' 
      AND bokningar.Monday = '1' ## Monday this is dynamically changed to current date 
      AND bokningar.avbokad < '1' 
      AND tilldelade.bok_id IS NULL

答案 2 :(得分:0)

您需要进行设置操作。

简单的减号查询可以解决您的问题。

Select * from tableA
minus
Select * from tableB;

这将显示tableA中不存在于tableB中的所有数据。 你可以在这里阅读更多相关信息。 http://en.wikipedia.org/wiki/Set_operations_%28SQL%29

针对您的具体情况,请尝试以下方法:

Select * from tableA A
minus
Select * from tableB B where B.tilldelad='3013-09-30';