On 24 Feb 2011, at 07:49, Aric Bills wrote:

> people (a table of individuals who are somehow interrelated)
>  fields: uid (among others)
> 
> partners (links individuals [i.e., individual spouses] to couple IDs)
>  fields: coupleid, personid
> 
> children (links children to their parents' couple ID)
>  fields: coupleid, personid

Cousin's IDs is tricky, if you want to do it absolutely correctly; easier if 
you can assume that there have been no incestuous relationships. The key is 
that you need all the relevant relatives in a single row. I'll give it a go...

SELECT PersonA.personID, PersonB.personID
  FROM Children AS PersonA,
       INNER JOIN Partners AS PartnersA ON (PersonA.CoupleID = 
PartnersA.CoupleID)
       INNER JOIN Children AS Parent1A ON (ParentsA.personID = 
PartnersA.personID)
       INNER JOIN Children AS Parent2A ON (Parent1A.personID > 
Parent2A.personID AND ParentsA.personID = PartnersA.personID)
       INNER JOIN Partners AS GPartners1A ON (GPartners1A.coupleID = 
Parent1A.coupleID)
       INNER JOIN Partners AS GPartners2A ON (GPartners2A.coupleID = 
Parent2A.coupleID)
 Children AS PersonB,
       INNER JOIN Partners AS PartnersB ON (PersonB.CoupleID = 
PartnersB.CoupleID)
       INNER JOIN Children AS Parent1B ON (ParentsB.personID = 
PartnersB.personID)
       INNER JOIN Children AS Parent2B ON (Parent1B.personID > 
Parent2B.personID AND ParentsB.personID = PartnersB.personID)
       INNER JOIN Partners AS GPartners1B ON (GPartners1B.coupleID = 
Parent1B.coupleID)
       INNER JOIN Partners AS GPartners2B ON (GPartners2B.coupleID = 
Parent2B.coupleID)
  WHERE PersonA.personID > PersonB.personID
    AND (GPartners1A.personID = GPartners1B.personID
      OR GPartners2A.personID = GPartners1B.personID
      OR GPartners1A.personID = GPartners2B.personID
      OR GPartners2A.personID = GPartners2B.personID
        )
    AND NOT (Parent1A.personID = Parent1B.personID
      OR Parent2A.personID = Parent1B.personID
      OR Parent1A.personID = Parent2B.personID
      OR Parent2A.personID = Parent2B.personID
        )
    AND NOT (GPartners1A.personID = Parent1B.personID
      OR GPartners2A.personID = Parent1B.personID
      OR GPartners1A.personID = Parent2B.personID
      OR GPartners2A.personID = Parent2B.personID
        )
    AND NOT (Parent1A.personID = GPartners1B.personID
      OR Parent2A.personID = GPartners1B.personID
      OR Parent1A.personID = GPartners2B.personID
      OR Parent2A.personID = GPartners2B.personID
        )
;

Best Regards,

Phil Willoughby
-- 
Managing Director, StrawberryCat Limited

StrawberryCat Limited is registered in England and Wales with Company No. 
7234809.

The registered office address of StrawberryCat Limited is:

107 Morgan Le Fay Drive
Eastleigh
SO53 4JH

_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to