【问题标题】:select multiple columnns, group by one column, involves clob选择多列,按一列分组,涉及clob
【发布时间】:2019-04-08 09:49:29
【问题描述】:

我想从 3 个表中选择多个列,并按 self_object_id 分组。其中一列(gene_info)属于 CLOB 类型。

我尝试对除 self_object_id 之外的每一列使用 max(),但我不能,因为此函数不适用于 CLOB 数据类型。我该如何解决?

SELECT gene_info, pi.id, race, id_card_no, sdg.create_datetime
FROM person_info pi, sample_info si, sample_dna_gene sdg
WHERE pi.id = si.self_object_id
AND si.self_object_id = sdg.sample_id
AND si.self_object_id IN ('34B00F424CFE4DA389A7F7914D54AA62','8EF79471D9A3481590BD4CA6FC09231E','43E85B5BC34  94EA6B71D3D289A3A8AF0')
GROUP BY self_object_id

【问题讨论】:

  • 为什么在FROM 子句中使用逗号而不是正确、明确的JOIN 语法?为什么您没有限定所有列名,以便其他人知道这些列的来源。
  • 因为我有 3 个表时不知道如何正确使用 join。当我只加入 2 时,我知道如何使用它。 where 似乎最直接并给我正确的结果。
  • 。 . (1)在第二张表后面加一个JOIN也不是很难;周围有很多例子。 (2)我无法遵循查询逻辑,因为我不知道这些列来自哪些表。

标签: sql database oracle types


【解决方案1】:

首先,您不能GROUP BYCLOB。你就是不能。你必须找到其他方法来做到这一点。如果您的 CLOBs 相当短,少于 4000 个字符,您可以将它们转换为 VARCHAR2s 并以这种方式分组。就个人而言,我不喜欢 Oracle 风格的 JOINs,但它们是有效的。

其实,等等。您在此查询中没有聚合,因此您不需要任何类型的 GROUP BY 子句。您是否要删除重复项? DISTINCT 就是这样做的方法。

select distinct
       dbms_lob.substr( gene_info, 4000 ) as gene_info, 
       pi.id, race, id_card_no, sdg.create_datetime
  from person_info pi, 
       sample_info si on si.self_object_id = pi.id, 
       sample_dna_gene sdg on sdg.sample_id = si.self_object_id
 where si.self_object_id in ( ... )

【讨论】:

  • 感谢我让它与 to_char() 一起工作,并为除我想要使用 group by 的列之外的所有列添加 max()。
  • 我也不认为 distinct 在这里能如我所愿。它会返回唯一的组合而不是特定的列
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-22
  • 1970-01-01
  • 2021-10-16
  • 2021-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多