使用join而不是subselect更改sql查询

时间:2014-02-04 12:15:37

标签: mysql sql join subquery

我遇到了以下问题: 因为条目的数量可能会非常大,所以我想在sql查询中使用连接而不是子选择。

它涉及以下三个简化表:

devices:
- id

confirmation_requests:
- id
- filePath

confirmation
- id
- requestId (references confirmation_requests.id)
- deviceId (references devices.id)

目标是获取所有确认请求,这些请求未由给定设备确认(在确认表中有条目)。

我只是使用普通子查询来找到解决方案,这是您在此处找到的示例: http://sqlfiddle.com/#!2/13fd3/1

SELECT * 
FROM confirmation_requests 
WHERE id NOT IN (SELECT confirmation_request_id
                     FROM confirmations
                     WHERE device_id = 1);

谢谢!

1 个答案:

答案 0 :(得分:2)

您可以在表格上LEFT JOIN进行与device_id = 1匹配的确认,然后排除WHERE子句中的确认:

SELECT cr.* 
FROM confirmation_requests cr
LEFT JOIN confirmations c ON (cr.id = c.confirmation_request_id AND c.device_id = 1)
WHERE c.id IS NULL;