【问题标题】:Select only one specific value from tables从表中仅选择一个特定值
【发布时间】:2014-03-19 09:26:58
【问题描述】:

我有 3 张桌子:

  • Duties
  • Activities
  • Activity Types

一项职责具有一项或多项活动,一项活动具有多种活动类型。

例如我有两个职责:

  1. 职责 1 有 2 个活动。活动类型为“TYPE1”的活动 1,活动类型为“TYPE2”的活动 2。
  2. 职责 2 有 2 个活动,两个活动的活动类型均为“TYPE2”。

我希望我的 select 语句检索具有“TYPE2”的所有职责,但如果职责具有活动类型为“TYPE1”、“TYPE2”或任何其他类型的活动,则不应选择它们。 IE。仅选择所有活动都具有活动类型“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'

【问题讨论】:

  • 请查看答案。如果一个答案就足够了,请不要忘记通过选中答案旁边的复选标记将您的问题标记为已回答。

标签: sql select join


【解决方案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'

这将排除任何具有其他活动类型的活动

【讨论】:

    【解决方案2】:

    你可以用一个子查询来负担它,这是可读的方式:“所有职责都有一个没有其他类型活动的 Type2 活动”

    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
    

    如果我们的数据库品牌支持 CTE,可读性可能会有所提高。

    【讨论】:

    • 这正是我所做的并且它有效,但我被告知不要使用子查询:(
    • @user3436814,好的,已发布。
    猜你喜欢
    • 2021-10-05
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2017-02-23
    相关资源
    最近更新 更多