此SQL查询中的错误是什么?

时间:2018-02-10 11:13:03

标签: sql oracle11g

CREATE TABLE medico(
cod_medico NUMBER(5),
cod_reparto NUMBER(5),
nome VARCHAR2(30),
cognome VARCHAR2(30),
specializzazione VARCHAR2(30),
recapito VARCHAR2(10),
primario VARCHAR2 (2)
);

CREATE TABLE paziente (
codice_fiscale VARCHAR2(16),
cod_paziente number(5),
nome VARCHAR2(30),
cognome VARCHAR2(30),
recapito VARCHAR2(10),
sesso VARCHAR2(1),
altezza VARCHAR2(4),
peso VARCHAR2(4),
data_nascita DATE,
gruppo_sanguigno VARCHAR2(3)
);


CREATE TABLE visita(
cod_visita NUMBER(5),
codice_fiscale VARCHAR2(16),
cod_medico NUMBER(5),
data_visita DATE,
prescrizione VARCHAR2(300),
referto VARCHAR2(8),
sintomi VARCHAR2(300)
);    
SELECT *
FROM (SELECT *
    FROM medico JOIN visita
    ON medico.cod_medico = visita.cod_medico)
JOIN(
    SELECT *
    FROM paziente JOIN visita
    ON paziente.codice_fiscale = visita.codice_fiscale)
ON paziente.codice_fiscale = visita.codice_fiscale;

错误:

ORA-00904: "VISITA"."CODICE_FISCALE": invalid identifier
00904. 00000 -  "%s: invalid identifier" 
*Cause:
*Action:
Errore alla riga: 9, colonna: 30

1 个答案:

答案 0 :(得分:1)

表paziente仅存在于内联视图(子查询)的范围内。因为您已将表放在子查询中,所以最终的ON子句无法看到''表名。根据您正在尝试完成的内容,您需要将表直接相互连接,而不是通过子查询。如,

SELECT *
FROM medico 
JOIN vista ON medico.cod_medico = visita.cod_medico
JOIN paziente ON paziente.codice_fiscale = visita.codice_fiscale

如果这不是您想要实现的目标,请描述表格的结构以及您尝试对子查询执行的操作。另一种方法是保留子查询,但为它们添加别名并明确表示您尝试加入的内容,例如,

SELECT *
FROM (SELECT *
    FROM medico JOIN visita
    ON medico.cod_medico = visita.cod_medico) AS a
JOIN(
    SELECT *
    FROM paziente JOIN visita
    ON paziente.codice_fiscale = visita.codice_fiscale) AS b
ON a.codice_fiscale = b.codice_fiscale;

这是这个想法的一个例子,但由于在子查询中使用了两次相同的列名,它几乎肯定会失败 - 你需要用实际字段替换*工作。