Re: Relational Algebra Expression
Date: Sat, 09 Feb 2008 20:19:18 -0400
Message-ID: <47ae4308$0$4046$9a566e8b_at_news.aliant.net>
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. Received on Sun Feb 10 2008 - 01:19:18 CET