我們假設MySQL中的以下表格描述文件夾中包含的文檔。如何將NOT IN子查詢重寫爲連接
mysql> select * from folder;
+----+----------------+
| ID | PATH |
+----+----------------+
| 1 | matches/1 |
| 2 | matches/2 |
| 3 | shared/3 |
| 4 | no/match/4 |
| 5 | unreferenced/5 |
+----+----------------+
mysql> select * from DOC;
+----+------+------------+
| ID | F_ID | DATE |
+----+------+------------+
| 1 | 1 | 2000-01-01 |
| 2 | 2 | 2000-01-02 |
| 3 | 2 | 2000-01-03 |
| 4 | 3 | 2000-01-04 |
| 5 | 3 | 2000-01-05 |
| 6 | 3 | 2000-01-06 |
| 7 | 4 | 2000-01-07 |
| 8 | 4 | 2000-01-08 |
| 9 | 4 | 2000-01-09 |
| 10 | 4 | 2000-01-10 |
+----+------+------------+
列ID是主鍵,表DOC的列F_ID是引用表FOLDER的主鍵的非空外鍵。通過在where子句中使用文檔的'DATE',我想查找哪些文件夾只包含選定的文檔。對於除2000-01-05較早版本的文檔,這可以寫成:
SELECT DISTINCT d1.F_ID
FROM DOC d1
WHERE d1.DATE < '2000-01-05'
AND d1.F_ID NOT IN (
SELECT d2.F_ID
FROM DOC d2 WHERE NOT (d2.DATE < '2000-01-05')
);
並正確返回「1」和「2」。通過閱讀 http://dev.mysql.com/doc/refman/5.5/en/rewriting-subqueries.html 如果將子查詢替換爲連接,則可以提高大表的性能。我已經發現了與NOT IN和JOINS相關的問題,但並不完全符合我的要求。那麼,關於如何用連接書寫的想法呢?
正確和超快速的響應!雖然我沒有問,但我想我不能避免重複'2000-01-05'。 –
子查詢連接的性能是否比'WHERE'上的子查詢更好? – bfavaretto