所以我有兩個表,都具有相同的結構:
| 表A | 表B |
|---|---|
| ID | ID |
| 1 | 1 |
| 3 | 2 |
| 5 | 3 |
| 10 | 5 |
我需要比較 tableA.ID 和 tableB.ID 并找出兩個表中哪些 ID 是空閑的,并獲取這些空閑 ID 的間隔。
為了找出一張表中的免費 ID,我使用了這個:
SELECT
a.ID 1 start,
min(b.ID) - 1 end,
min(b.ID) - a.ID - 1 gap
FROM
tableA a,
tableB b
WHERE a.ID < b.ID
GROUP BY a.ID
HAVING start < MIN(b.ID)
它作業正常,我得到了我的差距:
表A
| 開始 | 結尾 | 差距 |
|---|---|---|
| 2 | 2 | 1 |
| 4 | 4 | 1 |
| 6 | 9 | 4 |
表B
| 開始 | 結尾 | 差距 |
|---|---|---|
| 4 | 4 | 1 |
但隨后我需要比較結果并檢查兩個表中哪些 ID 是空閑的。結果應如下所示:
| 開始 | 結尾 | 差距 |
|---|---|---|
| 4 | 4 | 1 |
| 6 | 9 | 4 |
在這里,我真的迷路了,我不知道該怎么做。我嘗試使用加入,但它對我不起作用:
WHERE a.ID < b.ID AND a.ID IN (
SELECT
c.ID 1 startID,
min(d.ID) - 1 endID,
min(d.ID) - c.ID - 1 gap
from
tableB c,
tableB d
where c.rowid < d.rowid
)
uj5u.com熱心網友回復:
您可以合并這兩個表以從兩者中獲取唯一值,然后使用LEAD函式查找空閑 ID,如下所示:
WITH reserved_IDs AS
(
SELECT ID FROM tableA
UNION
SELECT ID FROM tableB
UNION SELECT 0 /* To start from 1 in case 1 value is missing from both tables*/
)
SELECT start_id, end_id, gap
FROM
(
SELECT ID 1 AS start_id,
LEAD(ID) OVER (ORDER BY ID) - 1 AS end_id,
LEAD(ID) OVER (ORDER BY ID)-ID-1 gap
FROM reserved_IDs
) T
WHERE gap > 0
查看演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/522395.html
下一篇:SQL視窗函式依賴?
