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
在patient_study表中,放射科医师或技师可能有0值。 我如何从查询中获得技术员姓名和放射科医生姓名。
答案 0 :(得分:7)
您需要两次在users_reg
表上加入以获得结果。一次是放射科医师,另一次是技术人员:
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;
见SQL Fiddle with Demo。这将返回所有患者研究的放射科医师和技师名称/类型。如果要替换任何列中的null,则可以使用类似于以下内容的COALESCE
:
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;
答案 1 :(得分:3)
在您的情况下,您可以使用isnull
:
select *
from Patient_Study as PS
inner join Users_Reg as U on U.User_ID = isnull(nullif(PS.Radiologist, ''), PS.Technician)
或两个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示例。
作为我可能会说的建议 - 如果您没有适当的值,请在表格中存储null
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')
答案 2 :(得分:1)
选中此fiddle
代码:
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;
如果你把它变成NULL而不是“”(我更喜欢)
SELECT *
FROM Patient_Study
INNER JOIN Users_Reg
ON COALESCE(Patient_Study.Radiologist,Patient_Study.Technician) = Users_Reg.User_ID
我选择COALESCE而不是ISNULL,因为您可以在那里添加其他技术人员。
答案 3 :(得分:1)
这个怎么样。
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
我添加了一个标记StudiedBy来区分放射科医生和Techinician。 您可以添加where条件来检查特定的User_Reg
答案 4 :(得分: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.
见