Re: Relational Algebra Expression

From: JOG <jog_at_cs.nott.ac.uk>
Date: Sat, 9 Feb 2008 15:05:57 -0800 (PST)
Message-ID: <7103f58c-2928-478a-b647-afed0151d06d_at_y5g2000hsf.googlegroups.com>


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 ;) Received on Sun Feb 10 2008 - 00:05:57 CET

Original text of this message