2015-12-10 1 views
0

Не было никакого способа, которым я мог бы соответствовать тому, что мне нужно в названии, поэтому извините за это. Во всяком случае, здесь у меня есть стол:Как выбрать людей, которые имеют уникальное полное имя

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 

Проще говоря, человек однозначно идентифицируется ПИН-кодом. Как вы знаете, разные люди могут иметь одно и то же имя. Из этой таблицы мне нужно выбрать только те, которые не имеют одного имени с кем-либо еще. Обратите внимание, что один человек может иметь более одной записи в таблице. Поэтому, если мы возьмем эту таблицу данных примеров, MARY BROWN и JOSCH ZEPLIN имеют право на участие, потому что у них есть уникальные имена. Хотя у MARY BROWN две записи, это один и тот же человек из-за того же PIN-кода. Но ДЖОН СМИТ не отвечает требованиям, потому что есть два человека с тем же именем. Каким будет правильный SQL для получения этого результата?

EDIT: Кроме того, мне нужно получить только одну запись. Поэтому в основном из этой таблицы я должен был бы увидеть результат ниже:

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

Вам нужны все столбцы в результате или только имена? – Sachu

+0

Все, кроме столбца ID. –

ответ

3

Группа по имени и фамилии и подсчитывать различные контакты:

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

Это то, что мне нужно. Большое спасибо @Thorsten. –

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) 
+0

Я проверил ваш запрос на стол, но у меня есть все записи. –

+0

@ Микаил Абдуллаев: Вы, должно быть, допустили ошибку. Запрос выглядит отлично. –

+0

@ThorstenKettner, да, извините за это. Я допустил ошибку. В моей базе данных я забыл назначить другой PIN-код одной из записей JOHN SMITH. Большое спасибо. –

Смежные вопросы