(旁白:爲什麼一般人(拉胡爾是不是唯一的一個,由任何想象的延伸),從問題中省略了表的名稱?)
這是很難做到的以關係的方式,因爲它本質上依賴於(無序)集上的數據和關係代數作品的排序。我認爲我們應該假定DocID列沒有意義,並且不能用來幫助解決問題。
在此示例中,您有S003和S005並且缺少S004。我們如何判斷有缺失的價值?據推測,因爲存在一個比較操作,它告訴我們'小於','相等','大於',還因爲有一個差異函數告訴我們S003和S005之間的差距是2.假設' >'和朋友做比較(在這裏工作的字符串),並且你可以產生一個存儲過程webid_diff(),它接受兩個WebID值並返回差異。
然後,您可以編寫一個查詢,如:
SELECT a.webid, MIN(b.webid) AS min_next
FROM AnonymousTable AS a, AnonymousTable AS b
WHERE a.webid < b.webid
GROUP BY a.webid;
這使用表之間的非等值連接和自身查找每個項目的最低繼任者WebID值。
以此爲核心,我們可以過濾結果以僅選擇那些WebID和Min_Next之間的差距超過一個的行。所以,我認爲我們得到(1 嘗試):
SELECT x.webid, y.min_next, webid_diff(x.webid, y.min_next) AS gap
FROM AnonymousTable AS x,
(SELECT a.webid, MIN(b.webid) AS min_next
FROM AnonymousTable AS a, AnonymousTable AS b
WHERE a.webid < b.webid
GROUP BY a.webid
) AS y
WHERE x.webid = y.webid
AND webid_diff(x.webid, y.min_next) > 1;
是聯接在外部水平實際上得到了我們什麼有用嗎?我不這麼認爲,所以我們可以將其刪除,從而導致(第2次嘗試):
SELECT y.webid, y.min_next, webid_diff(y.webid, y.min_next) AS gap
FROM (SELECT a.webid, MIN(b.webid) AS min_next
FROM AnonymousTable AS a, AnonymousTable AS b
WHERE a.webid < b.webid
GROUP BY a.webid
) AS y
WHERE webid_diff(y.webid, y.min_next) > 1;
這確實工作。試圖將webid_diff()函數放入內部查詢中給我帶來了一些問題 - 至少GAP表達式必須包含在GROUP BY子句中,但那會給出錯誤的答案。
HAVING子句用於應用過濾條件集合體,所以它看起來有點好像查詢可能歸結爲:
SELECT a.webid, MIN(b.webid) AS min_next, webid_diff(a.webid, b.webid) AS gap
FROM AnonymousTable AS a, AnonymousTable AS b
WHERE a.webid < b.webid
GROUP BY a.webid
HAVING webid_diff(a.webid, b.webid) > 1;
然而,這不起作用(對我來說,我的DBMS - IBM Informix Dynamic Server),因爲webid_diff()不是聚合。
下面是我用於webid_diff()函數的代碼(你必須調整以適應您的DBMS的語法),以及若干輔助webid_num()函數:
CREATE FUNCTION webid_num(a CHAR(4)) RETURNING INTEGER;
DEFINE i INTEGER;
LET i = substr(a, 2, 3);
RETURN i;
END FUNCTION;
CREATE FUNCTION webid_diff(a CHAR(4), b CHAR(4)) RETURNING INTEGER;
DEFINE i, j INTEGER;
LET i = webid_num(a);
LET j = webid_num(b);
RETURN (j - i);
END FUNCTION;
您的評論是有效的。這個問題已被澄清。我建議取消這個答案,以避免反對票。 – 2008-12-31 17:51:25