Re: Relational Algebra Expression

From: JOG <jog_at_cs.nott.ac.uk>
Date: Sat, 9 Feb 2008 17:08:41 -0800 (PST)
Message-ID: <3a4c688a-d43e-4a14-bc82-a93fa0ab6cfc_at_h11g2000prf.googlegroups.com>


On Feb 10, 12:19 am, Bob Badour <bbad..._at_pei.sympatico.ca> wrote:
> JOG wrote:
> > On Feb 9, 10:30 pm, Bob Badour <bbad..._at_pei.sympatico.ca> wrote:
>
> >>JOG wrote:
>
> >>>On Feb 9, 4:59 pm, gamehack <gameh..._at_gmail.com> wrote:
>
> >>>>On Feb 9, 4:47 pm, Bob Badour <bbad..._at_pei.sympatico.ca> wrote:
>
> >>>>>gamehack wrote:
> >>>>>[snip]
>
> >>>>>>What I'm trying to do is extract all the years where we have more than
> >>>>>>1 relation for the year. For the sample table, we need to get:
> >>>>>>1999
> >>>>>>2001
>
> >>>>>>I tried to do in a couple of ways but I couldn't. I tried using a
> >>>>>>projection on Year so that I can remove duplicates but then I can't
> >>>>>>just use difference because the new relations are not compatible. Any
> >>>>>>hints are greatly appreciated.
>
> >>>>>Equijoin on year and inequality theta-join on name project on year.
>
> >>>>Hi,
>
> >>>>I can't really understand what this means - can you bracket it so I
> >>>>can see the results of each operation?
>
> >>>>Thanks very much,
> >>>>g
>
> >>>Well Bob gave you everything you needed, but I guess you're learning
> >>>the stuff at the moment (coursework?) so lets break down his
> >>>instructions:
>
> >>>1) EQUIJOIN R with itself (renamed B) where Year = B.Year
> >>>2) RESTRICT where Name != B.Name
> >>>3) PROJECT on Year
>
> >>>In terms of whats going on:
> >>>1 - Gives you a relation of any two rows with the same year
> >>>concatenated together
> >>>2 - Removes the years that were joined with themselves in 1.
> >>>3 - Gets rid of all attributes apart from Year. Because a relation is
> >>>a set this also eliminates any duplicates, and voila you are left with
> >>>the years that appeared more than once.
>
> >>>Note if you use SQL it can allow duplicates (which is of course
> >>>particularly brain-dead given a relation is a set), so you have to
> >>>specify you want distinct tuples:
>
> >>>SELECT DISTINCT Year FROM R, R as B
> >>>WHERE R.Year = B.Year AND R.Name != B.Name
>
> >>He mentioned relational algebra. I figured he would have to rename
> >>attributes instead. In D, I would use "rename all but year prepending
> >>'other_'" or something similar. I don't think that 'B.' crap flies with
> >>relations.
>
> > You see what being faced with SQL every day does to someone!? It
> > addles the brain. I should sue.
>
> > Out of interest, here is an equivalent procedural solution to the OP's
> > problem:
>
> > std::set<int> results;
> > std::set<row>::iterator i;
> > std::set<row>::iterator j;
>
> > for(i = R.begin(); i != R.end(); ++i)
> > {
> > for(j = i + 1; j != R.end(); ++j)
> > {
> > if ( (*i).year == (*j).year)
> > {
> > results.insert((*i).year);
> > break;
> > }
> > }
> > }
>
> > nice isn't it ;)
>
> It would be just peachy keen if it didn't have a bug.

Bugs!? Clean as a whistle I tell you. Received on Sun Feb 10 2008 - 02:08:41 CET

Original text of this message