选择相同的姓氏但不是相同的名称

时间:2016-09-15 01:30:08

标签: sql

我有一张fname | lname | startyear | endyear

的表格

认为具有相同fname和lname的人是一个独特的人。 可以有多个具有相同fname | lname的条目。

1)我如何找到属于不同人的所有相同姓氏?

例如 'tom'|'jerry'| 1990 | 1991 |

'vlad'|''jerry'| 1991 | 1992 |

'tim'|'cook'| 1991 | 1992 |

'tim'|'cook'| 1992 | 1993 |

输出:

杰里

2)“Mary”Jane的两个词之间有哪些人(名字和姓氏)?

例如 'mary'|'jane'| 1989 | 1990 |

'tom'|'jerry'| 1990 | 1991 |

'vlad'|''jerry'| 1991 | 1992 |

'tim'|'cook'| 1991 | 1992 |

'tim'|'cook'| 1992 | 1993 |

'mary'|'jane'| 1993 | 1994

输出

汤姆杰里

vlad jerry

蒂姆·库克

1 个答案:

答案 0 :(得分:1)

1)在下面的查询中,内联视图将为您提供fname,lname&s的所有唯一组合,以及它与lname上的原始表连接,它将为您提供所有唯一的名称,但具有多个名字。

SELECT lname
  FROM table t1
INNER JOIN
    ( SELECT fname,lname
        FROM table 
       GROUP BY fname,lname
       HAVING COUNT(1) = 1 
     ) t2
 ON t1.lname = t2.lname;

2)在此查询中,内联视图将返回Mary Jane所服务的术语的最小年份和最大年份,然后将其交叉连接到原始表格,并在startyear和endyear上完成比较,这将为您提供所有在玛丽珍之间服务的fname,lname&#。

 SELECT fname,lname
   FROM table t1
  CROSS JOIN 
  ( SELECT MIN(startyear) AS minstart,MAX(endyear) AS maxend
      FROM table 
     WHERE fname = 'Mary' AND lname = 'Jane'
  ) t2
 WHERE t1.startyear >= t2.minstart AND t1.endyear <= t2.maxstart;