0

我在构建一个从表 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 中的所有行 IF 表 B.tilldelad=Requested Date。(fe 2013-09-30)

我不确定这是否有意义?

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

由于它的重复事件,相同的 bok_id 可以在表 B 中存在几次,但在表 A 中只存在一次......

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 的行才会被过滤掉。

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

4

3 回答 3

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...)
于 2013-09-30T12:12:07.330 回答
2

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

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
于 2013-09-30T14:15:21.357 回答
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';
于 2013-09-30T12:08:49.907 回答