Received: from localhost (postgresql.org [64.49.215.8]) by postgresql.org (Postfix) with ESMTP id 3A4C2475C33 for ; Wed, 14 Aug 2002 22:16:57 -0400 (EDT) Received: from mps2.plala.or.jp (mpsb-nat02.plala.or.jp [202.212.114.145]) by postgresql.org (Postfix) with ESMTP id BAFBF475B77 for ; Wed, 14 Aug 2002 22:16:39 -0400 (EDT) Received: from [192.168.0.4] ([218.47.225.244]) by mps2.plala.or.jp with ESMTP id <20020815021632.MXZN1768.mps2.plala.or.jp@[192.168.0.4]>; Thu, 15 Aug 2002 11:16:32 +0900 Date: Thu, 15 Aug 2002 11:17:15 +0900 From: Masaru Sugawara To: Andre Schubert Subject: Re: Need Help for select Cc: pgsql-sql@postgresql.org In-Reply-To: <20020814160421.2c75727e.andre@km3.de> References: <20020814201310.C84C.RK73@sea.plala.or.jp> <20020814160421.2c75727e.andre@km3.de> Errors-To: rk73@sea.plala.or.jp Message-Id: <20020815101638.C862.RK73@sea.plala.or.jp> MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit X-Mailer: Becky! ver. 2.05.03 X-Virus-Scanned: by AMaViS new-20020517 X-Archive-Number: 200208/242 X-Sequence-Number: 9088 On Wed, 14 Aug 2002 16:04:21 +0200 Andre Schubert wrote: > I want to compare if a tuple in c exist in b for each c.d_id and b.a_id. > In c exists 3 tuples: (1,2), (3,4), (5) > and want to find these tuples in b. Probably I would think I have reached the correct query. Table b and c, however, must have unique indices like the following in order to get the result by using it, because it pays no attention to the duplicate keys. If there are no primary keys, it will become more complicated for eliminating duplicate keys. create table b ( a_id int, c_id int, constraint p_key_b primary key(a_id, c_id) ); create table c ( b_id int, d_id int, constraint p_key_c primary key(b_id, d_id) ); SELECT a.name, d.name FROM (SELECT t2.a_id, t2.d_id FROM (SELECT b.a_id, t1.d_id, t1.n FROM (SELECT c.b_id, c.d_id, t0.n FROM c, (SELECT d_id, COUNT(*) AS n FROM c GROUP BY d_id) AS t0 WHERE c.d_id = t0.d_id ) AS t1 LEFT OUTER JOIN b ON (t1.b_id = b.c_id) WHERE b.a_id IS NOT NULL ) AS t2 GROUP BY t2.a_id, t2.d_id, t2.n HAVING COUNT(*) = t2.n ) AS t3, a, d WHERE a.id = t3.a_id AND d.id = t3.d_id Regards, Masaru Sugawara