【问题标题】:POSTGRES - Combine same columns with different text in one rowPOSTGRES - 将相同的列与不同的文本组合在一行中
【发布时间】:2015-09-15 04:56:12
【问题描述】:

我有三个要合并的表。我有一个表医生,病人和手术。医生代表所有医生。 Patient 代表患者,操作持有来自患者和医生的主要密钥。 我如何编写一个查询来显示我的 ChiefDoctor 和 assistantDoctor 和 Patient?到目前为止我达到了什么?

显示首席医生或助理医生的名字和姓氏。我如何写来显示一张同时包含首席和助理的表格?

select a.vorname|| ' ' || a.nachname AS leitenderArzt, p.firstname || ' ' || p.lastname AS patient
from angestellter a inner join operation o on a.id = o.leitenderarzt
inner join patient p on o.patientident=p.ident

| id | firstname       | lastname      | patient      |
| 1  | ImA             | ChiefDoctor1  | p.firstname  |
| 3  | ImA             | ChiefDoctor3  | p.firstname  |

我的数据库的底层结构与表示。

CREATE TABLE doctor
(
  id serial NOT NULL,  
  firstname character varying(255) NOT NULL,
  lastname character varying(255) NOT NULL,  
  CONSTRAINT angestellter_pkey PRIMARY KEY (id),
}

 Table doctor
 |id | firstname | lastname        |
 | 1 | ImA       | ChiefDoctor1    |
 | 2 | ImA       | AssistantDoctor |
 | 3 | ImA       | ChiefDoctor2    |

CREATE TABLE patient
(
  ident serial NOT NULL,  
  firstname character varying(255) NOT NULL,
  lastname character varying(255) NOT NULL,
  CONSTRAINT patient_pkey PRIMARY KEY (ident),
}

Table patient
| ident | firstname | lastname |
| 1     | Operated  | ME       |

CREATE TABLE operation
(
  id serial NOT NULL,
  chiefDoctor integer NOT NULL,
  AssistantDoctor integer NOT NULL,
  patientident integer NOT NULL,
  CONSTRAINT operation_pkey PRIMARY KEY (id),
  CONSTRAINT fkoperation539608 FOREIGN KEY (patientident)
      REFERENCES patient (ident) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT fkoperation745809 FOREIGN KEY (assistantDoctor)
      REFERENCES angestellter (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT fkoperation949671 FOREIGN KEY (chiefDoctor)
      REFERENCES angestellter (id) MATCH SIMPLE
}

Table operation
| id | doctorID | doctorID | patientID |
| 1  |    1     |    2     |     1     |

我如何编写一个查询来显示谁操作了一个全名的病人?它应该是这样的。

| id | chiefdoctor       | assistantdoctor      | patient      |
|----| ImA + ChiefDoctor |ImA + AssistantDoctor | Operated + ME|

【问题讨论】:

  • “%s/}/);/g :-]”是什么意思? :-]
  • 您因此使用} 来终止表定义。并省略了;
  • 操作表是krank。它是一个多对多的表,但并不是真正的多对多。如果工作人员中有另一位医生,你会怎么做?我会通过一个表操作和另一个多对多表来改进体系结构。比你想加入什么都行
  • 如果工作人员中来了另一位医生,你会怎么做?我将插入医生价值观(4,ImA,ChiefDoctor4);查询也会向我显示那个医生,还是我错过了什么?我添加了一位新医生,如果他做了手术,我将在操作“4”、“someAssistant”、“some patient”中添加他的 ID。

标签: sql database postgresql


【解决方案1】:

第一个也是最直观的方法是加入两次医生:

select o.id
     , d1.firstname || ' + ' || d1.lastname as chiefdoctor
     , d2.firstname || ' + ' || d2.lastname as assistantdoctor
     , p.firstname || ' + ' || p.lastname as patient
from operation o
join doctor d1
    on o.chiefDoctor = d1.id
join doctor d2
    on o.AssistantDoctor = d2.id
join patient p
    on o.patientident = p.ident

您可能希望修剪名称,如下所示:

trim(both from d1.firstname) || ' + ' || trim(both from d1.lastname)

但我觉得这不是你最关心的问题,所以为了缩短解决方案,我把它省略了

【讨论】:

  • 完美。我稍后会尝试修剪,因为我整天都坐在这个上面。非常感谢。
猜你喜欢
  • 2019-10-15
  • 1970-01-01
  • 2016-06-30
  • 1970-01-01
  • 2019-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-11
相关资源
最近更新 更多