我有以下数据库表,其中包含有关人员,疾病和药物的信息:
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)
对于那些不想使用子查询的人:
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)
根据优化器,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)
| 归档时间: |
|
| 查看次数: |
120 次 |
| 最近记录: |