2012-01-05 34 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

相關問題