Thread: Searching for results with an unknown amount of data

Searching for results with an unknown amount of data

From
"DownLoad X"
Date:
Hi,

I've got two tables, A and B, the first one containing columns

A_ID | info

where A_ID is primary, so that this table stores various information about 
an object, and the second containing columns

A_ID | property

where property is an integer referring to a particular property that an 
object may possess.  I've seperated these into two tables so that an object 
may have several (ie an unknown number of) properties.

Now, I want to find all objects that have at most properties 1,2,3, say (so 
something with (1,2) is okay, as is (1,2,3)). I can't see a way to do this 
-- can anyone help?
Also, what if I want to find all the objects possessing properties 4,5,6, as 
well as possibly other things? I've done it with nested SELECTs (constructed 
programmatically), but I think this is quite slow and not a very pleasing 
solution.

Obviously, both these things will need to be done for an arbitrary list of 
integers.

Thanks,
DL




Re: Searching for results with an unknown amount of data

From
"Thomas F. O'Connell"
Date:
On Sep 2, 2005, at 2:40 PM, DownLoad X wrote:

> Hi,
>
> I've got two tables, A and B, the first one containing columns
>
> A_ID | info
>
> where A_ID is primary, so that this table stores various
> information about an object, and the second containing columns
>
> A_ID | property
>
> where property is an integer referring to a particular property
> that an object may possess.  I've seperated these into two tables
> so that an object may have several (ie an unknown number of)
> properties.
>
> Now, I want to find all objects that have at most properties 1,2,3,
> say (so something with (1,2) is okay, as is (1,2,3)). I can't see a
> way to do this -- can anyone help?
> Also, what if I want to find all the objects possessing properties
> 4,5,6, as well as possibly other things? I've done it with nested
> SELECTs (constructed programmatically), but I think this is quite
> slow and not a very pleasing solution.
>
> Obviously, both these things will need to be done for an arbitrary
> list of integers.
>
> Thanks,
> DL

Without knowing more about your data or schema, couldn't you do
something like

SELECT A_ID, property
FROM "B"
WHERE property IN ( 1, 2, 3 );

To accommodate arbitrary lists, I can't imagine how you'd do it
without using a PL, but you could still build your IN clause
programmatically.

--
Thomas F. O'Connell
Co-Founder, Information Architect
Sitening, LLC

Strategic Open Source: Open Your i™

http://www.sitening.com/
110 30th Avenue North, Suite 6
Nashville, TN 37203-6320
615-469-5150
615-469-5151 (fax)

Re: Searching for results with an unknown amount of data

From
Bruno Wolff III
Date:
On Fri, Sep 02, 2005 at 20:40:24 +0100, DownLoad X <x_download@hotmail.com> wrote:
> Now, I want to find all objects that have at most properties 1,2,3, say (so 
> something with (1,2) is okay, as is (1,2,3)). I can't see a way to do this 
> -- can anyone help?

It sounds like you are trying to find all objects that do not have any
properties outside of a specific list. One way to get that list is:

SELECT a_id FROM a   WHERE     NOT EXISTS       (SELECT 1         FROM b         WHERE           b.a_id = a.a_id
  AND           b.property NOT IN (1, 2, 3)       )
 
;

This doesn't take into account the semantics of nulls. If your data can have
nulls in it, then you need to decide precisely what you want and adjust
the query appropiately.


Re: Searching for results with an unknown amount of data

From
"DownLoad X"
Date:

> > Now, I want to find all objects that have at most properties 1,2,3, say 
>(so
> > something with (1,2) is okay, as is (1,2,3)). I can't see a way to do 
>this
> > -- can anyone help?
>
>It sounds like you are trying to find all objects that do not have any
>properties outside of a specific list. One way to get that list is:

That's exactly right.

>
>SELECT a_id
>   FROM a
>     WHERE
>       NOT EXISTS
>         (SELECT 1
>           FROM b
>           WHERE
>             b.a_id = a.a_id
>             AND
>             b.property NOT IN (1, 2, 3)
>         )
>;

Yupp, this appears to do it! The 'double negation' is very clever.

Thanks a lot,
DL