2013-08-02 6 views
8

Sql fiddleSQL-Abfrage Namen bekommen Spalte null

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 

In patient_study Tabelle kann Radiologe oder Techniker haben 0 Wert sein. Wie bekomme ich Techniker Name und Radiologe Name von Abfrage.

+3

+1 für SQL Geige –

+1

sehen Ja, das gute Möglichkeit ist :-) +1 –

Antwort

7

Sie wollen zweimal auf der users_reg Tabelle JOIN das Ergebnis zu erhalten. Einmal für den Radiologen und den anderen für die Techniker:

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; 

Siehe SQL Fiddle with Demo. Dadurch werden Name und Typ des Radiologen und des Technikers für alle Patientenstudien zurückgegeben. Wenn Sie die Null in einer der Spalten ersetzen möchten, dann könnten Sie COALESCE ähnlich der folgenden verwenden:

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; 

Siehe SQL Fiddle with Demo

+0

Dank fragen BlueFeet – John

1

prüfen diese fiddle

Der Code:

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; 

Wenn Sie jemals statt NULL machen "" (was ich würde es vorziehen)

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

ich wählen statt ISNULL COALESCE , wie Sie andere Techniker dort hinzufügen können.

3

in Ihrem Fall könnten Sie isnull verwenden:

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

oder zwei 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 mit Beispiel.

Als Ratschläge, die ich sagen könnte - Speicher null Werte in der Tabelle, wenn Sie keine richtigen Wert haben

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

Wie wäre es damit.

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 

Ich habe eine Flagge StudiedBy hinzugefügt, um den Radiologen von Techinician zu unterscheiden. können Sie fügen dem die Bedingung für bestimmte User_Reg zu überprüfen

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. 

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

Verwandte Themen