2013-09-22 65 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表,并确定表中缺少哪些范围值。