【问题标题】:fetching only values that does not contain a particular value in any of its row仅获取其任何行中不包含特定值的值
【发布时间】:2026-02-13 08:20:03
【问题描述】:

我的要求是列出所有医生开出的所有处方,这些医生至少开过一次由 公司克莱恩。列出医生姓名、药物名称、患者 姓名和处方日期。

例如,如果存储在数据库中的数据是这样的

CREATE TABLE DOCTOR (
    DID         VARCHAR2(20)
        CONSTRAINT Doctor_DID_NotNull NOT NULL,
    DName       VARCHAR2(50),
    Speciality      VARCHAR2(70),
    YearOfExp       Number,
CONSTRAINT Doctor_PK PRIMARY KEY (DID)
);

CREATE TABLE PATIENT (
    PID         VARCHAR2(20)
        CONSTRAINT   PATIENT_PID_NotNull NOT NULL,
    PName       VARCHAR2(50),
    PDOB            DATE,
    PAddress        VARCHAR2(70),
    PPostalcode     VARCHAR2(12),
    FamilyDoctor        VARCHAR2(20),
CONSTRAINT Patient_PK PRIMARY KEY (PID),
CONSTRAINT Patient_FK FOREIGN KEY (FamilyDoctor) REFERENCES DOCTOR (DID)
);

这就是我用来获取数据的方法

SELECT dr.DName, pr.Tradename, pa.PName, pr.PrescDT
FROM PRESCRIPTION pr, DOCTOR dr, PATIENT pa
WHERE pr.PharName ='kleen'
AND pr.DID = dr.DID
AND pr.PID = pa.PID;

但它只返回给我说没有选择任何行。那我该如何表达,这样我才能得到我想要的结果。

【问题讨论】:

  • 今日提示:切换到现代、明确的JOIN 语法。更容易编写(没有错误),更容易阅读(和维护),并且在需要时更容易转换为外连接。
  • 可能是数据问题。你在处方中有哪些记录pr.PharName ='kleen'?我的猜测是没有。也许你有'KLEEN''Kleen' 的记录,也许你根本没有记录。
  • @APC,在我看来是对的。考虑UPPER(PharName) = 'KLEEN'

标签: sql oracle


【解决方案1】:

我不确定我是否正确理解了您的问题,但我认为您可以尝试以下查询。请尝试发布示例数据和所需的输出(文本格式)。有任何问题请联系。

SELECT dr.DName, pr.Tradename, pa.PName, pr.PrescDT
FROM DOCTOR dr
INNER JOIN (SELECT DISTINCT dr.DID
    FROM PRESCRIPTION pr
    INNER JOIN DOCTOR dr ON pr.DID = dr.DID
    WHERE pr.PharName ='kleen') dr2 ON dr.DID = dr2.DID
INNER JOIN  PRESCRIPTION pr ON pr.DID = dr.DID
INNER JOIN PATIENT pa ON  pr.PID = pa.PID
;

【讨论】:

    【解决方案2】:

    在患者表中,familydoctor是引用医生表的列名,试一下

    SELECT dr.dname, 
           pr.tradename, 
           pa.pname, 
           pr.prescdt 
    FROM   prescription pr 
           JOIN doctor dr 
             ON ( pr.did = dr.did ) 
           JOIN patient pa 
             ON ( dr.did = pa.familydoctor) 
    WHERE  LOWER(pr.pharname) = LOWER('kleen');
    

    如果需要,请根据您的要求添加LEFT OUTER JOINRIGHT OUTER JOIN

    理想情况下,您应该为所有三个表提供列和示例数据,然后再分析问题。

    【讨论】:

    • 实际上,我认为您的医生和患者之间的连接是不正确的。连接将在处方者和患者之间进行,我认为 OP 是正确的,但 OP 没有为处方者表提供 DDL。一个处方有两个参考,一个是写它的医生,一个是给病人的,可能是也可能不是病人的家庭医生。
    • @unleashed 我的加入基于familydoctor 引用did 的问题中提到的OP 的关系。
    • 我现在明白了。我理解这种联系。但是,有一些药学经验,虽然确实与医生有关,但不是在处方的上下文中,只是指定家庭医生(或有时称为初级医生)。
    最近更新 更多