Присоединение таблицы к себе для сравнения двух разных типов полей - PullRequest
0 голосов
/ 06 января 2012

извините за запутанный заголовок.

У меня есть две таблицы, individu и orgcont. individu выглядит примерно так:

individu
-------------
ind_id
org_id
email

orgcont выглядит примерно так:

orgcont
-------------
ind_id
function_code

У меня много пользователей, которые могут принадлежать к одному и тому же org_id, и каждый из них имеет свой собственный ind_id. «Лидеры» org_id имеют код функции «PRIM», все остальные не имеют значения. Я пытаюсь вернуть список org_id и email всех пользователей, у которых есть 'PRIM' function code, у которых есть пользователи, которые имеют NULL адреса электронной почты, которые не являются 'PRIM'.

У меня есть что-то подобное, но результаты не верны. Любая помощь будет оценена:

select
    i.email,
    i.org_id
from
    individu i,
    orgcont o,
    individu i2,
    orgcont o2
where
    i.ind_id = o.ind_id
    and i.org_id = i2.org_id
    and i2.ind_id = o2.ind_id
    and o.function_code = 'PRIM'
    and o2.function_code != 'PRIM'
    and i2.email is NULL

Ответы [ 2 ]

2 голосов
/ 06 января 2012

Попробуйте с exists:

select
    i.email,
    i.org_id
from
    individu i
    inner join orgcont o on
        i.ind_id = o.ind_id
where
    o.function_code = 'PRIM'
    and exists (
        select
            1
        from
            individu i2
            inner join orgcont o2 on
                i2.ind_id = o2.ind_id
        where
            i2.org_id = i.org_id
            and o2.function_code != 'PRIM'
            and i2.email is null
    )

Это вернет вам только одну строку для каждого лидера с людьми в их организации с null адресами электронной почты, в отличие от вашего исходного запроса, который будетвозвращать повторяющиеся строки.

Также обратите внимание на синтаксис объединения - здесь вы хотите сделать inner join, а не cross join, так что сделайте это явно.

Кроме того, вы можете простосделал select distinct, но это немного дороже, чем exists.

0 голосов
/ 06 января 2012

Это должно работать, INNER JOIN к подзапросу будет действовать как фильтр

SELECT DISTINCT i.email, i.org_id
FROM individu i 
     INNER JOIN orgcont o ON i.ind_id = o.ind_id
     INNER JOIN 
     (  SELECT i.id
        FROM individu i 
             INNER JOIN orgcont o ON i.ind_id = o.ind_id
        WHERE o.function_code != 'PRIM' AND i.email IS NULL 
     ) t ON t.id = i.id
WHERE o.function_code = 'PRIM'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...