2013-09-22 91 views
1

我創建了一個表,只是整數,所謂整數,條目從1到74,以找出哪些自動增量的ID已經從表ATO,其中也有74行顯示刪除的自動遞增行

SELECT Integers.ID 
    FROM Integers 
    LEFT JOIN ATO 
    ON Integers.ID = ATO.ID 
WHERE ATO.ID IS NULL 
刪除

是否有我可以使用的內部SQL範圍表,如Range [1-74],所以我可以創建這個「無用的」整數表?例如:

SELECT Range [1-74].ID 
    FROM Integers 
    LEFT JOIN ATO 
    ON Range [1-74].ID = ATO.ID 
WHERE ATO.ID IS NULL 

我使用Microsoft Access測試我的設計,因爲它很快速且很髒,並且容易啓動SQL查詢。我將稍後再移植到MySQL。

+2

您正在尋找創建一個行生成器。它們在RDBMS之間很少可移植。有很多關於如何在MySQL中執行堆棧溢出的問題(http://stackoverflow.com/questions/701444/how-do-i-make-a-row-generator-in-mysql),但我已經沒有使用Access足以知道它是否可能。 – Ben

回答

0

您可以使用where子句

SELECT Integers.ID from Integers left join ATO on Integers.ID=ATO.ID where ATO.ID is null 
AND Integers.ID BETWEEN 1 AND 74 

更好的是,使用IN關鍵字

SELECT ID from Integers WHERE ID BETWEEN 1 AND 74 
AND Integers.ID NOT IN (SELECT ID FROM ATO) 
+0

有沒有辦法讓Integers表空閒呢,因爲它只是爲連接而創建的,並且與數據庫根本沒有任何關係? – panny

+1

也許你可以解釋爲什麼NOT IN會更好? – Ben

+0

本,謝謝你補充一點。如果加入列是UNIQUE並標記爲這樣,則這兩個查詢在SQL Server中產生相同的計劃。我的觀點是查詢不那麼羅嗦,更具可讀性。這是在這個問題中提到的:http://stackoverflow.com/questions/1200295/sql-join-vs-in-performance –

1

訪問SQL不支持你想要什麼。如果您非常願意消除Integers表,則可以替換UNION查詢。

SELECT 1 AS the_number 
FROM Dual 
UNION ALL 
SELECT 2 
FROM Dual 
UNION ALL 
... etc, up to ... 
SELECT 74 
FROM Dual 

注意Dual是設計爲只包含一行的自定義表。

但是我不確定有多少SELECT可以UNION在一起。如果74是可能的,它可能會很慢。

使用Access SQL,Integers表更容易。

如果您可以使用其他SQL,您可以創建一個VBA過程來檢查ATO表,並確定表中缺少哪些範圍值。