2012-01-05 32 views
0

对于令人困惑的标题感到抱歉。加入一个表格来比较两种不同类型的字段

我有两个表,individuorgcontindividu看起来像:

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

orgcont看起来像:

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

我有很多的用户,可以属于同一org_id和他们各自的自己的ind_id。 org_id的'领导'具有'PRIM'的功能代码,其他人都无关紧要。我正在尝试返回所有拥有“PRIM”function code用户的电子邮件地址不是“PRIM”的用户的org_idemail的列表。

我有这样的事情,但结果不正确。任何帮助,将不胜感激:

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 
+1

“......结果是不正确的”怎么样? – 2012-01-05 21:09:24

+0

你的加入似乎并不正确。请注意,您用于加入的语法已过时。使用明确的JOIN语法会更好,更清晰:http://en.wikipedia.org/wiki/Join_(SQL) – 2012-01-05 21:09:46

+0

@AbeMiessler - OP可能会得到重复的行,因为列集中没有'distinct'。艾尔戈,我用'存在'做了它。即使他/她是一个钢笔迷。 – Eric 2012-01-05 21:13:40

回答

2

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

感谢Eric的注意,whodathunk这样的天赋可能来自(大概)一个明星粉丝! ;-) – etm124 2012-01-05 21:21:12

+0

@ etm124 - 熊的粉丝,其实:) – Eric 2012-01-05 21:23:46

0

这应该工作,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' 
+0

没有理由在这里做一个子查询 - 只是增加了一点复杂性和执行时间。只要你拥有“独特”的特征,加入这两张表就可以工作得很好。 – Eric 2012-01-05 21:25:00

相关问题