选择相关记录不存在的行

时间:2016-02-24 18:30:16

标签: mysql sql

我需要从mysql数据库中检索行,如下所示:我有一个合同表,一个合同行项目表和另一个名为udac的表。我需要所有没有订单项记录的合同,其中包含基于合约订单项和udac之间关系的条件。如果有更好的方式来陈述这个问题,请告诉我。

表结构

----contract---------------------     ---contractlineitem-----------
| id | customer_id | entry_date |     | id | contract_id | udac_id |
---------------------------------     ------------------------------
| 1  | 1234        | 2010-01-01 |     | 1  | 1           | 5       |
| 2  | 2345        | 2016-01-31 |     | 2  | 1           | 2       |
---------------------------------     | 3  | 1           | 1       |
                                      | 4  | 2           | 4       |
                                      | 5  | 2           | 2       |
                                      ------------------------------

---udac----------
| id | udaccode |
-----------------
| 1  |  SWBL/R  |
| 2  |  SWBL    |
| 3  |  ABL/R   |
| 4  |  ABL     |
| 5  |  XRS/F   |
-----------------

鉴于上述数据,合同2将显示,但合同1不会,因为它的合约项目指向以/ F或/ R结尾的udac。

这是我到目前为止所做的,但它不正确。

SELECT   c.*
  FROM   contract c
  JOIN   contractlineitem cli
    ON   c.id = cli.contract_id
 WHERE   c.entry_timestamp > '2016-01-01 00:00:00'
   AND   NOT EXISTS (
            SELECT   cli.id
              FROM   contractlineitem cli_i
              JOIN   udac u
                ON   cli_i.udac_id = u.id
             WHERE   u.udaccode LIKE '%/F' OR u.udaccode LIKE '%/R'
               AND   cli_i.contract_id = cli.contract_id);

1 个答案:

答案 0 :(得分:0)

汤姆评论你的WHERE子句错了可能是你追逐的问题。另外,如果优化器无法找到更好的方法,使用相关子查询可能会对性能造成问题。

以下是使用OUTER JOIN执行此操作的更好方法:

test {
    exclude '**/*FunctionalTest.groovy'
}
task functionalTest(type: Test) {
    include '**/*FunctionalTest.groovy'
}

尝试一下,看看它是否符合您的要求。查询基本上按照您的说法执行:它尝试加入到代码以'/ F'或'/ R'结尾的udac,但它只接受无法找到匹配的那些(SELECT c.* FROM contract c JOIN contractlineitem cli ON c.id = cli.contract_id LEFT OUTER JOIN udac u ON ( u.id = cli.udac_id AND ( u.udaccode LIKE '%/F' OR u.udaccode LIKE '%/R' ) ) WHERE c.entry_timestamp > '2016-01-01 00:00:00' AND u.id IS NULL )。

如果多次错误地返回同一行,请在前面抛出u.id IS NULL