如何选择具有唯一全名的人

时间:2015-12-10 11:31:00

标签: sql oracle

我无法在标题中找到我需要的东西,对不起。无论如何,我在这里有一张桌子:

CREATE TABLE DOCUMENTS 
(
  ID NUMBER (5,0)
, PIN VARCHAR2(7 BYTE) 
, FIRST_NAME VARCHAR2(20 BYTE) 
, LAST_NAME VARCHAR2(20 BYTE) 
);

INSERT INTO "JM_WARRANT"."DOCUMENTS"  VALUES (1,'AZU5FG', 'JOHN', 'SMITH')
INSERT INTO "JM_WARRANT"."DOCUMENTS"  VALUES (2,'BG45SF', 'MARY', 'BROWN')
INSERT INTO "JM_WARRANT"."DOCUMENTS"  VALUES (3,'AZU5FG', 'JOHN', 'SMITH')
INSERT INTO "JM_WARRANT"."DOCUMENTS"  VALUES (4,'WHT56B', 'JOHN', 'SMITH')
INSERT INTO "JM_WARRANT"."DOCUMENTS"  VALUES (5,'BG45SF', 'MARY', 'BROWN')
INSERT INTO "JM_WARRANT"."DOCUMENTS"  VALUES (6,'ZSF09V', 'JOSCH','ZEPLIN')

 ID   PIN    FIRST_NAME LAST_NAME
---|--------|----------|-------
1  |AZU5FG  | JOHN     | SMITH
2  |BG45SF  | MARY     | BROWN
3  |AZU5FG  | JOHN     | SMITH
4  |WHT56B  | JOHN     | SMITH
5  |BG45SF  | MARY     | BROWN
6  |ZSF09V  | JOSCH    | ZEPLIN

简单地说,一个人是由PIN唯一识别的。如您所知,不同的人可以使用相同的名称。从这个表中我只需要选择与其他人不共享同名的那些。注意一个人在表中可以有多个记录。因此,如果我们采用此样本数据表,MARY BROWN和JOSCH ZEPLIN是合格的,因为它们具有唯一的名称。虽然MARY BROWN有两个记录,但由于相同的PIN,它是同一个人。但约翰·史密斯不符合要求,因为有两个同名的人。获得此结果的正确SQL是什么?

修改 另外,我只需要一个记录。所以基本上从这张表中我需要看到以下结果:

   PIN    FIRST_NAME LAST_NAME
--------|----------|-------
 BG45SF  | MARY     | BROWN
 ZSF09V  | JOSCH    | ZEPLIN

2 个答案:

答案 0 :(得分:3)

按名字和姓氏分组并计算不同的引脚:

select first_name, last_name, min(pin) as pin
from documents
group by first_name, last_name
having count(distinct pin) = 1;

答案 1 :(得分:2)

使用not exists过滤此类人员:

select distinct FIRST_NAME, LAST_NAME, PIN 
from DOCUMENTS d1
where not exists(select * from DOCUMENTS d2 
                 where d1.FIRST_NAME = d2.FIRST_NAME and 
                       d1.LAST_NAME = d2.LAST_NAME and 
                       d1.PIN <> d2.PIN )