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 D010FCC8D7 for ; Thu, 17 Jul 2003 14:35:15 +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 68285-01 for ; Thu, 17 Jul 2003 14:35:39 +0000 (GMT) Received: from mail1.dr.myx.net (mail1.dr.myx.net [217.10.193.161]) by svr1.postgresql.org (Postfix) with ESMTP id 4575ACAE14 for ; Thu, 17 Jul 2003 11:35:14 -0300 (ADT) Received: from workstation24 (unknown [81.12.137.146]) by mail1.dr.myx.net (mydomain.myx.net) with ESMTP id 0BCB7300669; Thu, 17 Jul 2003 17:35:17 +0300 (EEST) Message-ID: <01d401c34c70$97983a50$0600a8c0@fix.ro> From: "Viorel Dragomir" To: "Richard Jones" , References: <009f01c34c6f$ca98d3c0$5192d781@lib.ed.ac.uk> Subject: Re: NOT and AND problem Date: Thu, 17 Jul 2003 17:34:55 +0300 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/222 X-Sequence-Number: 14336 ----- Original Message ----- From: "Richard Jones" To: Sent: Thursday, July 17, 2003 5:29 PM Subject: [SQL] NOT and AND problem > 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); If u want this u can obtain by DELETE FROM myTable WHERE (NOT(myTable.item_id = item.item_id )) OR (NOT(myTable.group_id = ep.group_id)); You can write ! instead of NOT. Look at the operations precedence. The NOT might get executed before "=". > > 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 > > > ---------------------------(end of broadcast)--------------------------- > TIP 2: you can get off all lists at once with the unregister command > (send "unregister YourEmailAddressHere" to majordomo@postgresql.org)