Как мне создать соединение, которое говорит, что поле не равно X? - PullRequest
4 голосов
/ 21 июля 2010

У меня есть следующая таблица базы данных с информацией о людях, заболеваниях и лекарствах:

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

Я хочу написать запрос, который находит всех людей, у которых болезнь_ид 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;

Это дает мне все записи, в которых человек не принимал drug_id 34, в отличие от людей, которые не принимали drug_id 34. Как мне написать запрос, который я хочу?

Ответы [ 3 ]

10 голосов
/ 21 июля 2010

Вы можете использовать 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)
7 голосов
/ 21 июля 2010

Для тех, кто не хочет использовать подзапрос:

   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
6 голосов
/ 21 июля 2010

В зависимости от оптимизатора 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...