2016-04-22 3 views
1

Ich lerne SQL. Ich möchte selectemployee (emp_name, emp_lname, project_name), die nur eine project (nicht mehr oder weniger) hat.Bessere Idee, um eindeutige Daten aus Tabelle auszuwählen

Ich habe 3 Tabelle in der Datenbank:

Tables:

create table employee(
    emp_id char (5) primary key, 
    emp_name nvarchar(15) not null, 
    emp_lname nvarchar(20) 
); 

create table project(
    pr_id char(5) primary key, 
    project_name nvarchar(10) not null, 
    project_budjet int 
); 

create table employee_project(
    emp_id char (5) foreign key references employee(emp_id), 
    pr_id char(5) foreign key references project(pr_id), 
    constraint premppk primary key(emp_id, pr_id) 
); 

ich select nur einzigartigen emp_id von employee_project versuchen.

Dieser Code gibt mir einzigartige emp_id von employee_project

select emp_id, count(pr_id) from employee_project 
    group by emp_id having count(pr_id) = 1 

Aber ich brauche emp_id und pr_id-selectemp_name, emp_lname und project_name. Ich versuche selectpr_id auch mit emp_id was ich schon habe. Code:

select ep.emp_id, ep.pr_id from employee_project as ep, 
    (
    select emp_id, count(pr_id) from employee_project 
     group by emp_id having count(pr_id) = 1 
    ) CT 
where CT.emp_id = ep.emp_id 

Jetzt habe ich alles, alles zu wählen, was ich über diese employee und project benötigen. Schließlich Code:

select employee.emp_name, employee.emp_lname, project.project_name 
    from employee, project, 
     (
     select ep.emp_id, ep.pr_id from employee_project as ep, 
      (
      select emp_id, count(pr_id) from employee_project 
       group by emp_id having count(pr_id) = 1 
      ) CT 
     where CT.emp_id = ep.emp_id 
     ) CK 
where CK.emp_id = employee.emp_id and CK.pr_id = project.pr_id 

Gibt es eine Möglichkeit, dies leicht zu tun.

Danke für Hilfe.

+1

Ich glaube nicht. "distinct" gibt mir zuerst, aber nicht einzigartig. Ich brauche es nicht, wenn es noch einmal in der Tabelle ist. – Guja1501

Antwort

1

Da es nur ein Projekt gibt, nach dem Sie suchen, können Sie eine beliebige Aggregatfunktion in der Gruppe verwenden, um auch das Projekt zu erhalten. Ich habe min(pr_id) verwendet, aber Sie könnten auch avg() oder max() zum Beispiel verwenden.

Danach können Sie den Tabellen beitreten, um alle anderen Spaltenwerte zu erhalten.

select e.*, p.* 
from 
(
    select emp_id, min(pr_id) as pr_id 
    from employee_project 
    group by emp_id 
    having count(pr_id) = 1 
) ep 
join employee e on e.emp_id = ep.emp_id 
join project p on p.pr_id = ep.pr_id 
Verwandte Themen