table1
id | no
-------
1 | 001
2 | 002
3 | 003
table2
id | no | user | yn
-------------------
1 | 002 | aaa | y
2 | 002 | bbb | y
3 | 002 | ccc | n
4 | 002 | bbb | y
案例說明:
table1 是單據主檔, table2 是單據的簽核記錄,假設 002 這張單據需要 aaa, bbb, ccc 三個人都同意(y),只要其中一個人不同意(n),就要重簽,所以 002 這張單目前簽核同意的人只有 bbb 一個人,我們要怎麼用一個 sql 語法抓出來呢?很簡單...
SELECT t1.no, t2.user
FROM table1 AS t1 INNER JOIN table2 AS t2 ON t1.no = t2.no
WHERE t1.no = '002' AND t2.id > (
SELECT MAX(id)
FROM table2
WHERE no = t1.no AND yn = 'n'
)
這樣寫看起來沒什麼問題
但在多層式子查詢結構的狀態下,強烈建議改成以下語法
SELECT t1.no, t2.user
FROM table1 AS t1 INNER JOIN table2 AS t2 ON t1.no = t2.no
WHERE t1.no = '002' AND t2.id > (
SELECT MAX(id)
FROM table2
WHERE no = t2.no AND yn = 'n'
)
差異點在於子查詢的 where 條件 前者是 no = t1.no 後者是 no = t2.no,基本判斷邏輯就是,讓子查詢 where 範圍越小越好,因為 t1.no 是指所有的單據,而 t2.no 已經被限縮到 002 這張單據,以我在工作上實際遇到的 case ,這兩種語法速度可以差到上百倍之多。
No comments:
Post a Comment