Forums before death by AOL, social media and spammers... "We can't have nice things"
|    comp.databases.ms-sqlserver    |    Notorious Rube Goldberg contraption    |    19,505 messages    |
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
|    Message 18,796 of 19,505    |
|    migurus to All    |
|    Re: join with one parent record only    |
|    04 Dec 12 23:07:46    |
   
   From: migurus@yahoo.com   
      
   On Monday, December 3, 2012 10:50:02 PM UTC-8, bradbury9 wrote:   
   > El martes, 4 de diciembre de 2012 00:42:39 UTC+1, migurus escribió:   
   >    
   > > There is parent-child table situation and I am interested in getting only   
   cases when only one parent record exists, the matching criteria are in both   
   tables. There are one or two child records per each parent.   
   >    
   > >    
   >    
   > >    
   >    
   > >    
   >    
   > > Running on SQL 2008, here is illustration, I omit key etc for brevity:   
   >    
   > >    
   >    
   > >    
   >    
   > >    
   >    
   > > declare @MAIN_NAME varchar(32) = 'B%';   
   >    
   > >    
   >    
   > > declare @ATTR int = 124;   
   >    
   > >    
   >    
   > >    
   >    
   > >    
   >    
   > > declare @MAIN_RECORD table (   
   >    
   > >    
   >    
   > > MAIN_NAME varchar(32) not null    
   >    
   > >    
   >    
   > > , ID int not null   
   >    
   > >    
   >    
   > > );   
   >    
   > >    
   >    
   > >    
   >    
   > >    
   >    
   > > declare @SUB_RECORD table (   
   >    
   > >    
   >    
   > > MAIN_ID int not null   
   >    
   > >    
   >    
   > > , LOW_VAL int not null   
   >    
   > >    
   >    
   > > , UP_VAL int not null   
   >    
   > >    
   >    
   > >    
   >    
   > >    
   >    
   > > );   
   >    
   > >    
   >    
   > >    
   >    
   > >    
   >    
   > > insert into @MAIN_RECORD values   
   >    
   > >    
   >    
   > > ('BETA-0' ,1)   
   >    
   > >    
   >    
   > > ,('BETA-1' ,2)   
   >    
   > >    
   >    
   > > ,('BETA-2' ,3);   
   >    
   > >    
   >    
   > >    
   >    
   > >    
   >    
   > > insert into @SUB_RECORD values   
   >    
   > >    
   >    
   > > -- BETA-0   
   >    
   > >    
   >    
   > > ( 1, 100, 200 )   
   >    
   > >    
   >    
   > > ,( 1, 101, 201 )   
   >    
   > >    
   >    
   > > -- BETA-1   
   >    
   > >    
   >    
   > > ,( 2, 1000, 1240 )   
   >    
   > >    
   >    
   > > ,( 2, 1001, 1251 )   
   >    
   > >    
   >    
   > > ,( 2, 1400, 1500 )   
   >    
   > >    
   >    
   > > -- BETA-2   
   >    
   > >    
   >    
   > > ,( 3, 1001, 1889 )   
   >    
   > >    
   >    
   > > ,( 3, 1002, 1458 )   
   >    
   > >    
   >    
   > >    
   >    
   > >    
   >    
   > >    
   >    
   > >    
   >    
   > >    
   >    
   > >    
   >    
   > > select M.MAIN_NAME   
   >    
   > >    
   >    
   > > , S.LOW_VAL   
   >    
   > >    
   >    
   > > , S.UP_VAL   
   >    
   > >    
   >    
   > >    
   >    
   > >    
   >    
   > > from @MAIN_RECORD M, @SUB_RECORD S   
   >    
   > >    
   >    
   > > where M.ID = S.MAIN_ID   
   >    
   > >    
   >    
   > > and M.MAIN_NAME like @MAIN_NAME   
   >    
   > >    
   >    
   > > and @ATTR between S.LOW_VAL and S.UP_VAL;   
   >    
   > >    
   >    
   > >    
   >    
   > >    
   >    
   > > result is    
   >    
   > >    
   >    
   > > MAIN_NAME LOW_VAL UP_VAL   
   >    
   > >    
   >    
   > > BETA-0 100 200   
   >    
   > >    
   >    
   > > BETA-0 101 201   
   >    
   > >    
   >    
   > > and this is good result, only one parent record found.   
   >    
   > >    
   >    
   > >    
   >    
   > >    
   >    
   > > If I say @ATTR = 1424   
   >    
   > >    
   >    
   > > result is   
   >    
   > >    
   >    
   > > MAIN_NAME LOW_VAL UP_VAL   
   >    
   > >    
   >    
   > > BETA-1 1400 1500   
   >    
   > >    
   >    
   > > BETA-2 1001 1889   
   >    
   > >    
   >    
   > > BETA-2 1002 1458   
   >    
   > >    
   >    
   > > and I'd like NOT to output anything in this case, as there are two parent   
   records matching.   
   >    
   > >    
   >    
   > >    
   >    
   > >    
   >    
   > > I can deal with this on the application side, where I would    
   rogrammatically count how many distinct MAIN_NAME came back and discard   
   results when it is more than one.    
   >    
   > >    
   >    
   > >    
   >    
   > >    
   >    
   > > But I suspect there are ways to do it on the server side. Any thoughts   
   would be appreciated.   
   >    
   >    
   >    
   > You could use:   
   >    
   >    
   >    
   > SELECT MAIN_NAME, MAX(LOW_VAL) AS LOW_VAL, MAX(UP_VAL) AS UP_VAL FROM   
   SUB_RECORDS WHERE @ATTR BETWEEN LOW_VAL AND UP_VAL   
   >    
   > GROUP BY MAIN_NAME HAVING COUNT(MAIN_NAME) = 1   
      
   Thanks, but I can not use this approach, as application needs both child   
   records if there are two of them   
      
   --- SoupGate-Win32 v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   
|
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
(c) 1994, bbs@darkrealms.ca