2016-09-26 94 views
0

我有三个表,tbl_doctors_detailstbl_timetbl_token查询使用CASE,当然,然后在postgresql不工作

我必须从tbl_timetbl_token中选择详细信息。也就是说,如果对于特定的医院医生有t_typetime然后从tbl_time中选择其他从tbl_token中选择。

例如,对于doctor_id是100和hospital_id 1,t_typetime。因此对于此用户,详细信息应从tbl_time表中选择。

下面是三个表的样本结构和数据:

enter image description here enter image description here

如何使用CASE状况查询吗?

我想:

SELECT * 
FROM 
(SELECT * CASE WHEN t_type= 'time' FROM dbname.tbl_doctors_details t1 THEN 
      dbname.tbl_time t2 
      ELSE 
      dbname.tbl_token t2 
      WHERE t1.hospital_id=t2.hospital_id AND t1.doctor_id=t2.doctor_id); 

我知道查询不工作,但如何使查询工作?

+1

http://meta.stackoverflow.com/questions/285551 /为什么我可能没有上传图像的代码时这样问/ 285557#285557 –

+0

我认为规范化的数据库会让你更容易做那。 – rbr94

+0

我已经给出了示例数据来问这个问题..它与真实的不同 – next2u

回答

0

你需要加入使用两个LEFT JOIN的两个表,然后聚结,找到匹配的数据:

SELECT t1.*, 
    colaesce(t_time.hospid, t_token.hospid), 
    colaesce(t_time.start, t_token.start) 
FROM dbname.tbl_doctors_details t1 
LEFT JOIN dbname.tbl_time t_time 
    ON t1.doctor_id=t_time.doctor_id 
AND t1.t_type= 'time' 
LEFT JOIN dbname.tbl_token t_token 
    ON t1.doctor_id=t_token.doctor_id 
AND t1.t_type= 'token'; 
0

使用CASE WHENSELECTLEFT JOIN两表所示。在两个LEFT JOIN使用条件t_type加入表中。在您的SELECT中,您现在可以检查表t1t2是否已加入并选择首选列。下面是一个示例(所选列只是为了说明一个样本):

SELECT CASE WHEN t1.id IS NULL THEN t2.id ELSE t1.id END AS joined_id 
FROM tbl_doctors_details as tbl_base 
LEFT JOIN tbl_time t1 ON t1.t_type = 'time' AND t1.doc_id = tbl_base.doc_id 
LEFT JOIN tbl_token t2 ON t2.t_type = 'token' AND t2.doc_id = tbl_base.doc_id 
0

做功课的人在这里的气味严重..咩

SELECT 

    doctors.* 
    , CASE 
    WHEN doctors.type = 'time' THEN time.start 
    ELSE token.start 
    END AS start 

FROM 

doctors 

    LEFT OUTER JOIN time 
    ON time.doc_id = doctors.doc_id 
    AND time.hospital_id = doctors.hospital_id 
    AND doctors.t_type = 'time' 

    LEFT OUTER JOIN token 
    ON token.doc_id = doctors.doc_id 
    AND token.hospital_id = doctors.hospital_id 
    AND doctors.t_type = 'token'