2016-12-25 64 views
1

我有一個超過100萬行的大型MySQL數據庫。我怎樣才能找到失蹤的開齋節?我如何在mysql中找到缺少的ID

+----+-----+ 
| id | eid | 
+----+-----+ 
| 1 | 1 | 
+----+-----+ 
| 2 | 2 | 
+----+-----+ 
| 3 | 4 | 
+----+-----+ 

我想列舉所有遺漏的eid's,在這個例子中是3。我嘗試了很多東西,但是我所做的一切都需要很多時間。

我希望有人能幫助我。

感謝

+0

也許5也不存在了。 – Strawberry

回答

1

您可以使用NOT EXISTS找到所需的行。

create table t(id integer, eid integer); 
insert into t values(1,1); 
insert into t values(2,2); 
insert into t values(3,4); 

SELECT id 
FROM t a 
WHERE NOT EXISTS 
    (SELECT 1 
    FROM t b 
    WHERE b.eid = a.id); 

或使用NOT IN

SELECT ID 
FROM t 
WHERE ID NOT IN 
    (SELECT EID 
    FROM t); 

生產:

| id | 
|----| 
| 3 | 
0

嘗試下面的查詢

SELECT ID FROM table WHERE ID NOT IN(SELECT EID FROM table); 
+0

此查詢的結果是:空集(5.35秒) – Gimo

+0

嘗試更新一個。 –

+0

嗨,我已經跑了這個查詢18小時前,並等待結果。這是正常的嗎? – Gimo

0

查找重複的號碼很簡單:

select number,count()from sequence group by id having count()> 1;

在這種情況下,沒有重複,因爲我沒有專注於這篇文章(找到重複是足夠簡單的,我希望你可以看到它是如何完成的)。儘管如此,我不得不搔頭尋找序列中缺失的數字。這是我在這第一炮:如爲L 左外連接序列上l.id [R從序列開始

選擇l.id + 1 + 1 = r.id 其中r.id爲null;

這個想法是排除連接對相同的序列,但移動了一個位置。具有相鄰號碼的任何號碼都將成功加入,並且WHERE子句將消除成功的匹配,留下缺少的號碼。結果如下:

https://www.xaprb.com/blog/2005/12/06/find-missing-numbers-in-a-sequence-with-sql/

+0

嗨,我收到錯誤消息: – Gimo

+0

#1064 - 您的SQL語法錯誤;檢查與您的MySQL服務器版本相對應的手冊,以便在序列組附近使用正確的語法(在ID爲1的情況下),在第1行有count()> 1 LIMIT 0,25' – Gimo