我需要从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);
答案 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
。