我目前正在开发一个sql数据库来管理一家医院。
医院有医生、病人、手术、诊断和分析预约表等。
我想创建一个查询,用于列出/显示医院内最常复发的患者(计算那些不断前来接受手术、诊断或分析预约的患者)。
我想创建一个视图,但还没有成功地使其工作,下面的代码将遵循。
我还想把它变成一个查询,尽管我不知道如何继续。如有任何建议,将不胜感激。
下面是我的尝试。
提前谢谢,致以最诚挚的问候。
(手头的功能是“复发病人”功能,其他功能在考虑问题时可以忽略不计)。
drop trigger despedirMedico;
drop trigger medicoDespedidoNaoFazConsultas;
drop trigger medicoDespedidoNaoFazCirurgias;
drop view melhoresMedicos;
drop view falhasDosMedicos;
drop table pedido cascade constraints;
drop table medicamento cascade constraints;
drop table receita cascade constraints;
drop table consulta cascade constraints;
drop table cirurgia cascade constraints;
drop table medpac cascade constraints;
drop table medico cascade constraints;
drop table especialidade cascade constraints;
drop table analise cascade constraints;
drop table paciente cascade constraints;
drop table pessoa cascade constraints;
create table pessoa (
nif varchar2(15) primary key,
nome varchar2(30) not null,
cod_postal varchar2(10) not null
);
create table paciente (
nif varchar2(15) primary key,
num_utente varchar2(20) unique,
foreign key (nif) references pessoa(nif)
);
create table analise (
id_analise varchar2(15) primary key,
descr_analise varchar2(50) not null,
data_realiz timestamp(0) with local time zone not null,
preco float(2) not null,
nif varchar2(15) not null,
foreign key (nif) references paciente(nif),
check (preco > 0)
);
create table especialidade (
cod_esp varchar2(5) primary key,
nome_esp varchar2(20) not null
);
create table medico (
nif varchar2(15) primary key,
salario float(2) not null,
cod_esp varchar2(5) not null,
despedido integer not null,
foreign key (cod_esp) references especialidade(cod_esp),
check(salario > 0 and despedido in (0, 1))
);
create table medpac (
med_nif varchar2(15) not null,
pac_nif varchar2(15) not null,
check (med_nif != pac_nif),
primary key (med_nif, pac_nif),
foreign key (med_nif) references medico(nif),
foreign key (pac_nif) references paciente(nif)
);
create table cirurgia (
id_cirurgia varchar2(15) primary key,
descr_cirurgia varchar2(20) not null,
num_sala integer not null,
data_realiz timestamp(0) with local time zone not null,
preco float(2) not null,
correu_bem integer not null,
med_nif varchar2(15) not null,
pac_nif varchar2(15) not null,
foreign key (med_nif, pac_nif) references medpac(med_nif, pac_nif),
check (num_sala > 0 and preco > 0 and correu_bem in (0, 1))
);
create table consulta (
id_consulta varchar2(15) primary key,
cod_esp varchar2(5) not null,
descr_consulta varchar2(20) not null,
num_sala integer not null,
data_realiz timestamp(0) with local time zone not null,
preco float(2) not null,
med_nif varchar2(15) not null,
pac_nif varchar2(15) not null,
foreign key (med_nif, pac_nif) references medpac(med_nif, pac_nif),
foreign key (cod_esp) references especialidade(cod_esp),
check (preco > 0)
);
create table receita (
id_receita varchar2(15) primary key,
id_consulta varchar2(15) not null,
foreign key (id_consulta) references consulta(id_consulta)
);
create table medicamento (
id_medicamento varchar(15) primary key,
nome_medicamento varchar2(30) not null
);
create table pedido (
id_receita varchar2(15) not null,
id_medic varchar2(15) not null,
quantidade integer not null,
primary key (id_receita, id_medic),
foreign key (id_receita) references receita(id_receita),
foreign key (id_medic) references medicamento(id_medicamento),
check (quantidade > 0)
);
create or replace view falhasDosMedicos as (
select pessoa.nif as nif, nome, sum(correu_bem) as num_falhas
from pessoa inner join (medico inner join cirurgia on (nif = med_nif)) on (pessoa.nif = medico.nif)
group by pessoa.nif, pessoa.nome
);
create or replace view melhoresMedicos as (
select nif, nome
from falhasDosMedicos
where (num_falhas = (select min(num_falhas) from falhasDosMedicos))
);
create or replace view recurringPatients as (
select pessoa.nif, nome, count(*) as atendimentos
from pessoa inner join (paciente inner join ) on (pessoa.nif = paciente.nif)
);
create or replace trigger medicoDespedidoNaoFazCirurgias
before insert or update on cirurgia
for each row
declare medico_despedido integer;
begin
select despedido into medico_despedido
from medico
where (medico.nif = :new.med_nif);
if medico_despedido = 1
then Raise_Application_Error (-20100, 'O médico especificado já não pode exercer funções neste hospital');
end if;
end;
/
create or replace trigger medicoDespedidoNaoFazConsultas
before insert or update on consulta
for each row
declare medico_despedido integer;
begin
select despedido into medico_despedido
from medico
where (medico.nif = :new.med_nif);
if medico_despedido = 1
then Raise_Application_Error (-20100, 'O médico especificado já não pode exercer funções neste hospital');
end if;
end;
/
create or replace trigger despedirMedico
after insert or update on cirurgia
for each row
declare numf integer;
begin
select num_falhas into numf
from falhasDosMedicos
where(falhasDosMedicos.nif = :new.med_nif);
if numf >= 3
then update medico set despedido = 1;
end if;
end;
/
暂无答案!
目前还没有任何答案,快来回答吧!