【问题标题】:how to select unique records from a table based on a column which has distinct values in another column如何根据在另一列中具有不同值的列从表中选择唯一记录
【发布时间】:2017-07-11 14:57:16
【问题描述】:

我有下面的表 SUBJ_SKILLS 有类似的记录

TCHR_ID | LINE_NBR | SUBJ             | SUBJ_TYPE     
--------| -------  | ----------       | ---------- 
1       | 1        | Maths            | R
1       | 2        | 101              | U
2       | 1        | BehaviourialTech | U
3       | 2        | Maths            | R
4       | 1        | RegionalLANG     | U
5       | 3        | ForeignLANG      | U
5       | 4        | Maths            | R
6       | 2        | Science          | R
7       | 1        | 101              | U
7       | 3        | Physics          | R
..
..

我正在尝试检索如下记录(即教授多个不同科目的单一教师)

TCHR_ID | LINE_NBR | SUBJ        | SUBJ_TYPE
--------| -------  | ----------  | ----------
5       | 3        | ForeignLANG | U
5       | 4        | Maths       | R
7       | 1        | 101         | U
7       | 3        | Physics     | R
1       | 1        | Maths       | R    
1       | 2        | 101         | U

这里,行号是唯一的,表示 TCHR_ID:5 教物理(LINE_NBR=1,但后来被删除)。因此,LINE_NBR 不会更新并保持原样。

我还有一个查找表 (SUBJ_LKUP) 用于主题及其类别/类型,如下所示(“R”代表常规主题,“U”代表独特主题)

   SUBJ              | SUBJ_TYPE
  -----------------  | ------------
   Maths             | R
   Physics           | R
   ForeignLANG       | U
   101               | U
   Science           | R
   BehaviourialTech  | U
   RegionalLANG      | U 

我解决此问题的方法是创建一个包含 2 条教师记录的表,并在基表 (SUBJ_SKILLS) 和新表上使用另一个查询来过滤掉不同的记录。我想出了以下查询..

查询-1:

create table tchr_with_2_subj as select SS.TCHR_ID 
from SUBJ_SKILLS SS, SUBJ_LKUP SL 
where SS.SUBJ = SL.SUBJ
and SL.SUBJ_TYPE IN ('R', 'U') AND SS.TCHR_ID IN
    (select SS.TCHR_ID from SUBJ_SKILLS SS)
     GROUP BY SS.TCHR_ID HAVING COUNT(*) = 2)  

查询 2:

select SS.TCHR_ID from SUBJ_SKILLS SS, tchr_with_2_subj tw2s
where  SS.TCHR_ID = tw2s.TCHR_ID
GROUP BY SS.TCHR_ID,SS.SUBJ_TYPE HAVING COUNT(*) > 1)  

问题:

1) Query-1 中的“IN”条件导致问题和提取错误记录。

2) 有没有更好的方法来编写查询以使用单个查询提取匹配记录(即,而不是创建表)

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 不确定,为什么需要加入SUBJ_SKILLSSUBJ_LKUP。有没有具体原因,问题中没有提到?
  • 我可能有 SUBJ 为 NULL 或垃圾数据的机会

标签: sql oracle


【解决方案1】:

对于你原来的问题的答案,我会使用窗口函数:

select ss.*
from (select ss.*,
             min(subj) over (partition by tchr_id) as mins,
             max(subj) over (partition by tchr_id) as maxs
      from SUBJ_SKILLS ss
     ) ss
where mins <> maxs;

目前尚不清楚主题类型如何适应,但如果您需要包含它,类似的逻辑将起作用。

【讨论】:

    【解决方案2】:

    您的第二张桌子可以从您的第一张桌子获得:

    select ss.*
    from
        subj_skills as ss
        inner join (
            select tchr_id
            from subj_skills
            group by tchr_id
            having count(*) > 1
            ) as mult on mult.tchr_id=ss.tchr_id;
    

    【讨论】:

      【解决方案3】:

      我会在这里使用分析函数,例如:

      select tchr_id, line_nbr, subj, SUBJ_TYPE
      from (select count(distinct subj) over (partition by tchr_id) as grp_cnt,
                   s.*
            from subj_skills s)
      where grp_cnt > 1
      

      如果需要过滤掉无效记录,可以在内部查询中进行。如果一个老师不能多次教授同一科目(req 'multiple different subject'可以翻译成'multiple subject'),那么我宁愿使用count(*)而不是count(distinct subj)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-01-31
        • 1970-01-01
        • 2020-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多