X-Original-To: pgsql-sql-postgresql.org@localhost.postgresql.org Received: from localhost (unknown [64.117.224.192]) by svr1.postgresql.org (Postfix) with ESMTP id 58B2ECCA26 for ; Thu, 17 Jul 2003 14:29:32 +0000 (GMT) Received: from svr1.postgresql.org ([64.117.224.193]) by localhost (svr4.postgresql.org [64.117.224.192]) (amavisd-new, port 10024) with ESMTP id 22296-10 for ; Thu, 17 Jul 2003 14:29:56 +0000 (GMT) Received: from lawnmarket.ucs.ed.ac.uk (lawnmarket.ucs.ed.ac.uk [129.215.166.63]) by svr1.postgresql.org (Postfix) with ESMTP id 0AFF1CCA25 for ; Thu, 17 Jul 2003 11:29:30 -0300 (ADT) Received: from LIBPC1118 (library-mg-01.net.ed.ac.uk [129.215.146.81]) by lawnmarket.ucs.ed.ac.uk (8.11.6p2/8.11.6) with SMTP id h6HETwJ21992 for ; Thu, 17 Jul 2003 15:29:59 +0100 (BST) Message-ID: <009f01c34c6f$ca98d3c0$5192d781@lib.ed.ac.uk> Reply-To: "Richard Jones" From: "Richard Jones" To: References: Subject: NOT and AND problem Date: Thu, 17 Jul 2003 15:29:11 +0100 MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2800.1106 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1106 X-Virus-Scanned: by amavisd-new at postgresql.org X-Archive-Number: 200307/220 X-Sequence-Number: 14334 Dear All, I am having some confusion over a query which is supposed to achieve the following: To remove a record from a table if the one or both of the columns containing references to other tables no longer point to table rows which still exist. There are good reasons why I cannot use foreign keys to maintain referential integrity, but I will not go into them, but they give rise to the need to "clean-up" my database table from time to time. The query that I have had most success with looks like this: DELETE FROM myTable WHERE (NOT myTable.item_id = item.item_id) AND (NOT myTable.group_id = ep.group_id); Which is odd, because logically it shouldn't work. What I find with the above queries is that as follows: let myTable.item_id = item.item_id be A let myTable.group_id = ep.group_id be B The derived and actual truth tables for the results of the where clause follow: Derived: A | B | Result 1 | 1 | 0 1 | 0 | 0 0 | 1 | 0 0 | 0 | 1 Actual: A | B | Result 1 | 1 | 0 1 | 0 | 0 0 | 1 | 1 0 | 0 | 1 This makes no sense to me, as effectively rows 2 and 3 of the Actual results truth table are the same (unless there's some subtle difference with regards to the order of the statements, otherwise just substitute A for B and vice versa). The result that I actually want from the operation is this: A | B | Result 1 | 1 | 0 1 | 0 | 1 0 | 1 | 1 0 | 0 | 1 which would suggest a query like: DELETE FROM myTable WHERE NOT (myTable.item_id = item.item_id AND myTable.group_id = ep.group_id); which ought to provide the above output. Instead, using this query, the output I get is as follows: A | B | Result 1 | 1 | 1 1 | 0 | 1 0 | 1 | 1 0 | 0 | 1 I can only conclude that Postgres is doing something with regards to the other two tables which I am unaware of. Can anyone help me understand what is going on? Any suggestions gratefully received. Cheers Richard Richard Jones ----------------------- Systems Developer Theses Alive! - www.thesesalive.ac.uk Edinburgh University Library r.d.jones@ed.ac.uk 0131 651 1611