1

我正在尝试将查询从 NOT IS 子句转换为左外连接以获得更好的性能。

以下是我的完美查询

SELECT a.company_code, account_name, legal_name FROM accounts a

WHERE account_id NOT IN (SELECT DISTINCT  account_id FROM phone_calls WHERE status = 2 ) AND account_id >10000

ORDER BY legal_name, account_name, account_id

因此,我想将其更改为左连接或某种类型的连接,以执行相同的查询。我已经尝试过了,但它对我不起作用

SELECT a.company_code, a.account_name, a.legal_name, p.phone_call_id
FROM accounts AS a
LEFT JOIN phone_calls AS p ON p.account_id = a.account_id

WHERE a.account_id >= 10000 AND p.status = 2 AND p.phone_call_id IS NULL

ORDER BY a.legal_name, a.account_name, a.account_id

我的第二个查询总是什么都不返回。

我已经尝试过这个查询,这给了我比第一个查询更多的结果,所以它不一样

SELECT a.company_code, a.account_name, a.legal_name, p.phone_call_id
FROM accounts AS a
LEFT JOIN phone_calls AS p ON p.account_id = a.account_id AND p.status = 2 AND a.account_id >= 10000

WHERE p.account_id IS NULL

ORDER BY a.legal_name, a.account_name, a.account_id
4

2 回答 2

3

将检查p.status = 2放在join子句中,而不是where子句中:

SELECT a.company_code, a.account_name, a.legal_name, p.phone_call_id
FROM accounts AS a
LEFT JOIN phone_calls AS p ON p.account_id = a.account_id AND p.status = 2
WHERE a.account_id >= 10000  
AND p.phone_call_id IS NULL

ORDER BY a.legal_name, a.account_name, a.account_id

如果放在 where 子句中,phone_calls 会被加入,加入后检查

  • 那 p.status=2
  • 那 p.phone_call_id 是 NULL

这些语句可能完全冲突(所有状态 = 2 的电话呼叫都有一个 id)。

通常,您不应该在 WHERE 子句中的左连接表上有一个子句(IS NULL/除外IS NOT NULL

于 2013-06-11T21:01:29.080 回答
0

只是好奇,但尝试使用一个NOT EXISTS子句:

SELECT company_code
     , account_name
     , legal_name 
FROM   accounts a
WHERE  account_id > 10000
   AND NOT EXISTS (
      SELECT 1 
      FROM phone_calls b
      WHERE b.status = 2 
        AND b.account_id = a.account_id
      )
ORDER BY legal_name, account_name, account_id

我认为只有EXPLAIN遗嘱才能揭示哪种技术更好。按未选择的列排序结果似乎很奇怪,但这是一个不同的问题。

于 2013-06-11T21:33:43.770 回答