Received: from makus.postgresql.org (makus.postgresql.org [98.129.198.125]) by mail.postgresql.org (Postfix) with ESMTP id 2B31B86080A; Tue, 24 Apr 2012 15:10:41 -0300 (ADT) Received: from oldperseverance.encs.concordia.ca ([132.205.96.94]) by makus.postgresql.org with esmtp (Exim 4.72) (envelope-from ) id 1SMkCG-000588-CZ; Tue, 24 Apr 2012 18:10:40 +0000 Received: from cacao.encs.concordia.ca (emilu@cacao.encs.concordia.ca [132.205.47.225]) by oldperseverance.encs.concordia.ca (envelope-from emilu@encs.concordia.ca) (8.13.7/8.13.7) with ESMTP id q3OIAOiE032129; Tue, 24 Apr 2012 14:10:25 -0400 Message-ID: <4F96EC90.6070600@encs.concordia.ca> Date: Tue, 24 Apr 2012 14:10:24 -0400 From: Emi Lu Reply-To: emilu@encs.concordia.ca User-Agent: Mozilla/5.0 (X11; Linux i686; rv:10.0) Gecko/20120129 Thunderbird/10.0 MIME-Version: 1.0 To: Steve Crawford CC: pgsql-sql@postgresql.org, "pgsql-general@postgresql.org >> \"pgsql-general@postgresql.org\"" Subject: Re: [SQL] Simple way to get missing number References: <4F96B57E.8080306@encs.concordia.ca> <4F96C9E9.7000005@pinpointresearch.com> In-Reply-To: <4F96C9E9.7000005@pinpointresearch.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.58 on oldperseverance.encs.concordia.ca at 2012/04/24 14:10:25 EDT X-Pg-Spam-Score: -4.2 (----) X-Archive-Number: 201204/552 X-Sequence-Number: 186865 I got it and thank you very much for everyone's help!! It seems that "left join where is null" is faster comparing with "except". And my final query is: select num as missing from generate_series(5000, #{max_id}) t(num) left join t1 on (t.num = t1.id) where t1.id is null; Emi On 04/24/2012 11:42 AM, Steve Crawford wrote: > On 04/24/2012 07:15 AM, Emi Lu wrote: >> Good morning, >> >> May I know is there a simple sql command which could return missing >> numbers please? >> >> For example, >> >> t1(id integer) >> >> values= 1, 2, 3 .... 5000000 >> >> select miss_num(id) >> from t1 ; >> >> >> Will return: >> =============== >> 37, 800, 8001 >> >> T > > select generate_series(1,5000000) except select id from t1; > > Example > > select anumber from fooo; > anumber > --------- > 1 > 3 > 5 > 7 > 9 > 11 > 13 > 15 > > select generate_series(1,15) except select anumber from fooo order by 1; > generate_series > ----------------- > 2 > 4 > 6 > 8 > 10 > 12 > 14 > > Cheers, > Steve