我有 2 個包含部分相似資料的訪問表,一個比另一個更豐富。這里的想法是通過欄位id和num連接兩個表,并從表 T2 中獲取不在表 T1 中的 num
T1:
| ID | 數 |
|---|---|
| 1 | 34 |
| 3 | 51 |
| 7 | 23 |
T2:
| ID | 數 | 地位 |
|---|---|---|
| 1 | 34 | 完畢 |
| 1 | 79 | 完畢 |
| 1 | 39 | 完畢 |
| 3 | 51 | 完畢 |
| 7 | 23 | 完畢 |
預期結果:
| ID | 數 | 地位 |
|---|---|---|
| 1 | 79 | 完畢 |
| 1 | 39 | 完畢 |
在訪問下,我在互聯網上讀到沒有像 MySQL 下那樣的 MINUS 運算子,所以我嘗試使用 EXCEPT 但查詢需要很長時間(10 分鐘后停止)
所以我嘗試了這個:
SELECT T2.*
FROM T2 LEFT JOIN T1 ON (T1.id =T2.id)
WHERE T1.num IS NULL AND ( (T2.status LIKE 'done') );
現在的問題是,我沒有 T2 中但 T1 中沒有的所有記錄
uj5u.com熱心網友回復:
您可以使用右連接。我建議在這種情況下不要使用“LIKE”,因為這很慢。您可以只使用 = 運算子。所以您的查詢將是:
SELECT t2.id, t2.num, t2.status
FROM t1
RIGHT JOIN t2
ON t1.id = t2.id
AND t1.num = t2.num
WHERE t1.num IS NULL
AND t2.status = 'done';
如果要加入的所有列名在兩個表中都相同,則可以更簡單地加入:
SELECT t2.id, t2.num, t2.status
FROM t1
RIGHT JOIN t2
USING (id,num)
WHERE t1.num IS NULL
AND t2.status = 'done';
我不喜歡這個,但它更短。最后,您的具體查詢取決于您的個人“品味”。
uj5u.com熱心網友回復:
有很多變種。
SELECT t2.*
FROM t2
LEFT JOIN t1 USING (id, num)
WHERE t1.id IS NULL
AND t2.status = 'done'
SELECT *
FROM t2
WHERE NOT EXISTS ( SELECT NULL
FROM t1
WHERE (t1.id, t1.num) = (t2.id, t2.num) )
AND status = 'done'
還有更多變種...
這些(或其他)變體中哪一個是最有效的?這取決于表定義和資料統計。
uj5u.com熱心網友回復:
您缺少加入的條件:
SELECT T2.*
FROM T2
LEFT JOIN T1
ON T1.id = T2.id
AND T1.num = T2.num
WHERE T1.num IS NULL
AND T2.status LIKE 'done';
在這里檢查。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/478484.html
