2013-08-02 11 views
8

Sql fiddlezapytań SQL nazwa coraz kolumna zerowa

CREATE TABLE [Users_Reg] 
(
    [User_ID]  [int] IDENTITY (1, 1) NOT NULL CONSTRAINT User_Reg_P_KEY PRIMARY KEY, 
    [Name]   [varchar] (50) NOT NULL, 
    [Type]   [varchar] (50) NOT NULL /*Technician/Radiologist*/ 
) 

CREATE Table [Study] 
(
    [UID]    [INT] IDENTITY (1,1) NOT NULL CONSTRAINT Patient_Study_P_KEY PRIMARY KEY, 
    [Radiologist]  [int], /*user id of Radiologist type*/ 
    [Technician]  [int], /*user id of Technician type*/ 

) 


select * from Study 
inner join Users_Reg 
on Users_Reg.User_ID=Study.Radiologist 

W patient_study tabeli mogą być Radiolog lub technik mają wartość 0. jak otrzymałem nazwę technika i radiologa z zapytania.

+3

+1 dla SQL skrzypce –

+1

Tak to jest dobry sposób, aby zapytać :-) +1 –

Odpowiedz

7

będą chcesz dołączyć na stole users_reg dwukrotnie, aby uzyskać wynik. Raz do radiologa, a inny dla technika:

select ps.uid, 
    ur1.name rad_name, 
    ur1.type rad_type, 
    ur2.name tech_name, 
    ur2.type tech_type 
from Patient_Study ps 
left join Users_Reg ur1 
    on ur1.User_ID=ps.Radiologist 
left join Users_Reg ur2 
    on ur2.User_ID=ps.Technician; 

Zobacz SQL Fiddle with Demo. To zwróci zarówno nazwę radiologa i technika/typ dla wszystkich badań pacjenta. Jeśli chcesz wymienić NULL w dowolnej kolumnie, a następnie można użyć COALESCE podobny do następującego:

select ps.uid, 
    coalesce(ur1.name, '') rad_name, 
    coalesce(ur1.type, '') rad_type, 
    coalesce(ur2.name, '') tech_name, 
    coalesce(ur2.type, '') tech_type 
from Patient_Study ps 
left join Users_Reg ur1 
    on ur1.User_ID=ps.Radiologist 
left join Users_Reg ur2 
    on ur2.User_ID=ps.Technician; 

Zobacz SQL Fiddle with Demo

+0

Dzięki BlueFeet – John

1

Sprawdź to fiddle

Kod:

SELECT * 
FROM  Patient_Study 
INNER JOIN Users_Reg 
     ON CASE 
       WHEN Patient_Study.Radiologist = '' 
       THEN Patient_Study.Technician 
       ELSE Patient_Study.Radiologist 
      END = Users_Reg.User_ID; 

Jeśli kiedykolwiek zrobić to NULL zamiast "" (co woleliby)

SELECT * 
FROM  Patient_Study 
INNER JOIN Users_Reg 
     ON COALESCE(Patient_Study.Radiologist,Patient_Study.Technician) = Users_Reg.User_ID 

wybiorę zlewają zamiast ISNULL , ponieważ możesz dodać tam innych techników.

3

w twoim przypadku można użyć isnull:

select * 
from Patient_Study as PS 
    inner join Users_Reg as U on U.User_ID = isnull(nullif(PS.Radiologist, ''), PS.Technician) 

lub dwa left outer joins:

select PS.*, isnull(UP.Type, UT.Type) as Type 
from Patient_Study as PS 
    left outer join Users_Reg as UP on UP.User_ID = PS.Radiologist 
    left outer join Users_Reg as UT on UT.User_ID = PS.Technician; 

SQL FIDDLE z przykładu.

jako porady mogę powiedzieć - sklep null wartości w tabeli, jeśli nie masz odpowiedniej wartości

INSERT INTO Patient_Study(Radiologist,Technician)VALUES('1','2') 
INSERT INTO Patient_Study(Radiologist,Technician)VALUES('1','') 
INSERT INTO Patient_Study(Radiologist,Technician)VALUES(null,'2') 
1

Jak na ten temat.

select *,'Radiologist' as StudiedBy from Patient_Study 
inner join Users_Reg 
on Users_Reg.User_ID=Patient_Study.Radiologist 
and Patient_Study.Radiologist>0 
Union 
select *,'Technician' from Patient_Study 
inner join Users_Reg 
on Users_Reg.User_ID=Patient_Study.Technician 
and Patient_Study.Technician >0 

Dodałem flagę StudiedBy, aby odróżnić radiologa od Techinician. Można dodać, gdzie warunek do sprawdzenia konkretnego User_Reg

1
select R.Name as TechnicianName,T.Name as RadiologistName 
from Patient_Study 
inner join Users_Reg R 
on Patient_Study.UID=R.User_ID 

inner join Users_Reg T 
on Patient_Study.UID=T.User_ID. 

zobaczyć

http://sqlfiddle.com/#!3/25d42/41