如何使用 Oracle SQL 仅获取单一类型

Posted

技术标签:

【中文标题】如何使用 Oracle SQL 仅获取单一类型【英文标题】:How to fetch only single type using Oracle SQL 【发布时间】:2021-11-17 02:04:30 【问题描述】:

我只想获取只有一种类型的公司。我正在使用 Oracle 12C。下面是示例数据集

结果集:-

请有人帮我解决这个问题。

【问题讨论】:

如果您只需要获取公司,为什么您仍然需要在输出中每个公司多行?每个公司一行就足够了。 另一件事:您的帖子被标记为 oracle11g 和 oracle12c。你的实际版本是什么?这可能会产生很大的不同;一个潜在的解决方案使用 match_recognize 子句,但这仅在 oracle 12.1 之后可用(所以 - 在 oracle 11g 中不可用)。请确保您始终为您的真实数据库标记正确的版本。 【参考方案1】:
select companyid, min(type_) as type_
from   [table_name]
group  by companyid
having min(type_) = max(type_)
;

[table_name] 替换为您的实际类型名称。另请注意,我使用type_(带下划线)作为列名。我希望你的列名不是type,这是一个保留关键字;如果是,请更改它。

一种可能的替代方法是使用having count(distinct(type_)) = 1 - 但这是一个糟糕的解决方案。它需要在每个组内进行distinct 操作(通过companyid)。相比之下,minmax 更容易跟踪。

【讨论】:

【参考方案2】:

你可以使用not exists:

select t.*
from t
where not exists (select 1
                  from t t2
                  where t2.companyid = t.companyid and t2.type <> t.type
                 );

【讨论】:

【参考方案3】:

另一种方法是将每个公司的MIN(TYPE) 与其MAX(TYPE) 进行比较。如果它们相同,则只有一个TYPE

SELECT CompanyId, Type
FROM myTable
WHERE COMPANYID IN (
  SELECT COMPANYID
  FROM myTable
  GROUP BY COMPANYID
  HAVING MIN(TYPE) = MAX(TYPE)
)

【讨论】:

以上是关于如何使用 Oracle SQL 仅获取单一类型的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PL-SQL 在 Oracle 中获取列数据类型

如何从 Oracle SQL 中的 BLOB 获取文本内容

如何仅使用 sql 在 apex oracle 的交互式网格中实现选择列表以及 oracle APEX 中可用的内容?

如何仅使用 Oracle SQL 返回 2 个字符串之间的差异

java中如何获取oracle存储过程返回的多个值。

Oracle SQL:如何删除 listagg 中的重复项