2013-08-02 34 views
8

Sql fiddleSql truy vấn nhận được tên cột rỗng

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 

Trong bảng patient_study có thể Bác sĩ X Quang hoặc Kỹ thuật viên có giá trị 0. cách tôi lấy tên kỹ thuật viên và tên radiologist từ truy vấn.

+3

+1 cho SQL fiddle –

+1

Có điều này là cách tốt để hỏi :-) 1 –

Trả lời

7

Bạn sẽ muốn THAM GIA trên bàn users_reg gấp đôi để có được kết quả. Một lần cho bác sĩ X quang và người kia cho kỹ thuật viên:

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; 

Xem SQL Fiddle with Demo. Điều này sẽ trả về cả tên X-quang và kỹ thuật viên/loại cho tất cả các nghiên cứu bệnh nhân. Nếu bạn muốn thay thế null trong bất kỳ cột nào, sau đó bạn có thể sử dụng COALESCE tương tự như sau:

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; 

Xem SQL Fiddle with Demo

+0

Cảm ơn BlueFeet – John

1

Kiểm tra fiddle

Các mã này:

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; 

Nếu bạn đã bao giờ làm cho nó NULL thay vì "" (mà tôi muốn)

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

tôi chọn COLALESCE thay vì ISNULL , bạn có thể thêm các kỹ thuật viên khác vào đó.

3

trong trường hợp của bạn, bạn có thể sử dụng isnull:

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

hoặc hai 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 với ví dụ.

Như lời khuyên tôi có thể nói - cửa hàng null giá trị trong bảng của bạn nếu bạn không có giá trị thích hợp

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

Làm thế nào về việc này.

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 

Tôi đã thêm cờ StudiedBy để phân biệt X-quang từ Techinician. Bạn có thể thêm nơi mà điều kiện để kiểm tra User_Reg cụ

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. 

thấy

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

Các vấn đề liên quan