如何创建一个表示字段不等于X的连接?

Jay*_*ren 4 sql database join

我有以下数据库表,其中包含有关人员,疾病和药物的信息:

PERSON_T              DISEASE_T               DRUG_T
=========             ==========              ========
PERSON_ID             DISEASE_ID              DRUG_ID
GENDER                PERSON_ID               PERSON_ID
NAME                  DISEASE_START_DATE      DRUG_START_DATE
                      DISEASE_END_DATE        DRUG_END_DATE
Run Code Online (Sandbox Code Playgroud)

我想写一个查询,查找所有患有疾病的人52但没服用药物34.我该怎么做?我在MySql中尝试了以下内容:

SELECT p.person_id, p.gender, p.name, disease_id, drug_id 
   FROM person_t as p 
   INNER JOIN disease_t on disease_t.person_id = p.person_id 
   RIGHT OUTER JOIN drug_t on drug_t.person_id = p.person_id 
   WHERE disease_id= 52 AND drug_id != 34;
Run Code Online (Sandbox Code Playgroud)

这给了我所有记录,其中一个人没有服用drug_id 34而不是没有服用drug_id的人34.我将如何编写我想要的查询?

Mar*_*ers 10

你可以使用NOT IN:

SELECT p.person_id, p.gender, p.name, disease_id
FROM person_t as p 
INNER JOIN disease_t d on disease_t.person_id = p.person_id 
WHERE disease_id = 52
AND p.person_id NOT IN (SELECT person_id IN drug_t WHERE drug_id = 34)
Run Code Online (Sandbox Code Playgroud)


OMG*_*ies 7

对于那些不想使用子查询的人:

   SELECT p.person_id, p.gender, p.name, disease_id
     FROM PERSON_T p 
     JOIN DISEASE_T d ON d.person_id = p.person_id 
LEFT JOIN DRUG_T dt ON dt.person_id = p.person_id
                   AND dt.drug_id = 34
    WHERE disease_id = 52
      AND dt.person_id IS NULL
Run Code Online (Sandbox Code Playgroud)


Ada*_*uth 6

根据优化器,NOT EXISTS可能比NOT IN更有效.试试看哪一个效果最好.

SELECT p.person_id, p.gender, p.name, disease_id, drug_id 
   FROM person_t as p 
   INNER JOIN disease_t on disease_t.person_id = p.person_id 
   WHERE disease_id= 52 AND NOT EXISTS (
       SELECT * from drug_T WHERE person_id = person_t.person_id AND drug_id = 34)
Run Code Online (Sandbox Code Playgroud)