2014-03-19 74 views
0

具體數值我有3個表:只選擇一個從表

  • Duties
  • Activities
  • Activity Types

一職有一個或多個活動,一個活動有多個活動類型。

例如我有2個職責:

  1. 佔空比1有2個活動。活動類型爲「TYPE1」的活動1,活動類型爲「TYPE2」的活動2。
  2. 工作2有2項活動,兩項活動都有活動類型「TYPE2」。

我希望我的select語句檢索「TYPE2」的所有職責,但如果職責中有活動類型爲「TYPE1」,「TYPE2」或任何其他類型的活動,則不應選擇它們。即只選擇所有活動具有活動類型「TYPE2」的職責。

這裏是我當前的查詢:

select columns from duties d 
join activity a on d.duty_id = a.id 
join activity_type t on t.id = a.act_id and activity_type = 'TYPE2' 
+0

請檢查答案的任何活動。如果一個答案足夠了,請不要忘記通過選中答案旁邊的複選標記將您的問題標記爲答案。 –

回答

1

,你可以使用子查詢負擔得起,這是可讀的方式:「有沒有有其他類型的活動,到第二類活動的所有職責」:

select distinct columns 
from duties d 
join activity a2 on d.duty_id = a2.id 
join activity_type t2 on t2.id = a2.act_id and activity_type = 'TYPE2' 
where d.duty_id not in 
(select duty_id.id from duties d 
    join activity a on d.duty_id = a.id 
    join activity_type t on t.id = a.act_id and activity_type <> 'TYPE2' 
) 

注意比這種查詢有性能不高由於每個主查詢行都執行了子查詢。

如果沒有標準的SQL子查詢:

select columns 
from 
    (
    select columns (including duty_id) 
    from duties d 
    join activity a on d.duty_id = a.id 
    join activity_type t on t.id = a.act_id and activity_type = 'TYPE2' 
) as yesT2 
left outer join 
    (
    select distinct d.duty_id 
    from duties d 
    join activity a on d.duty_id = a.id 
    join activity_type t on t.id = a.act_id and activity_type <> 'TYPE2' 
) as yesT1 
on 
    yesT2.duty_id = yesT1.duty_id 
where 
    yesT1.duty_id is Null 

可能在可讀性IY我們的數據庫品牌來提高支持CTE。

+0

這正是我所做的,它的工作,但我被告知不要使用子查詢:( – user3436814

+0

@ user3436814,好的,張貼。 – danihp

1
select duty_name from duty 
except 
select duty_name from duties d 
join activity a on d.duty_id = a.id 
join activity_type t on t.id = a.act_id and activity_type <> 'TYPE2' 

這將排除有其他的活動類型