Oracle 特定选择

Posted

技术标签:

【中文标题】Oracle 特定选择【英文标题】:Oracle specific selection 【发布时间】:2012-05-25 04:37:51 【问题描述】:

我有一张如下表

OWNERID 
PET_QUANTITY 
PET_TYPE

PET_TYPE 是 DOG、CAT 或 BIRD

每个所有者/宠物有一条记录,因此如果有一只狗和一只鸟,则将有两条记录,并且 pet_quantity 在两条记录中均为 2。

我想要该人有两只宠物并且宠物是狗和猫的所有 owner_ID。

【问题讨论】:

我希望这是一个愚蠢的学校问题(或类似问题),否则数据模型真的很糟糕。 【参考方案1】:

首先,数据模型相当不幸,因为特定行的PET_QUANTITY 的值取决于其他行中的数据。这违反了基本的规范化规则。这反过来又会造成您不可避免地不同步的情况,因此您必须确定是PET_QUANTITY 规则还是表中的行数规则。正确规范化的数据模型会为您提供更好的服务。

假设存在差异时PET_QUANTITY 进行规则,一种选择是使用INTERSECT

SELECT owner_id
  FROM your_table
 WHERE pet_quantity = 2
   AND pet_type = 'CAT'
INTERSECT
SELECT owner_id
  FROM your_table
 WHERE pet_quantity = 2
   AND pet_type = 'DOG'

另一个是做类似的事情

SELECT owner_id, COUNT(DISTINCT pet_type)
  FROM your_table
 WHERE pet_quantity = 2
   AND pet_type IN ('DOG', 'CAT')
 GROUP BY owner_id
HAVING COUNT(DISTINCT pet_type) = 2

【讨论】:

以上是关于Oracle 特定选择的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 特定选择

如何为oracle中的特定输入选择不包含空值的列名?

SQL - oracle - 如何从连接结果中选择特定部门

Oracle SQL 选择不同的查询以返回特定的行数

如何在 Oracle Sql Developer 中选择特定的列标题

Oracle SQL 排除特定类型的多行选择精确的两行