【问题标题】:Find out what group id contains all relevant attributes in SQL找出哪个组 id 包含 SQL 中的所有相关属性
【发布时间】:2018-09-18 14:21:42
【问题描述】:

因此,在这种情况下,我们拥有的群体是动物群体。

假设我有以下表格:

animal_id | attribute_id | animal
----------------------------------
 1        |  1           | dog   
 1        |  4           | dog
 2        |  1           | cat
 2        |  3           | cat
 3        |  2           | fish
 3        |  5           | fish


id | attribute
------------------
 1 | four legs 
 2 | no legs
 3 | feline
 4 | canine
 5 | aquatic

第一个表包含定义动物的属性,第二个表跟踪每个属性是什么。现在假设我们对一些数据运行查询并得到以下结果表:

attribute_id 
------------
     1
     4

此数据将描述一只狗,因为它是唯一同时具有属性 1 和 4 的 animal_id。我希望能够基于第三个表以某种方式获取 animal_id(在本例中为 1),其中本质上是一个已经生成的包含动物属性的表。

编辑

因此,具有 1 和 4 的第三个表不必是 1 和 4。它可以返回 2 和 5(鱼)或 1 和 3(猫)。我们可以假设它的结果总是完全匹配一种动物,但我们不知道是哪一种。

【问题讨论】:

  • 如果“狗”有第三个属性怎么办?它还会匹配 1 和 4 吗?
  • 如果 dog 有另一个属性,我们从查询中得到的列表将包含该属性。所以如果有第三个属性,比如'attribute_id = 7',那么表就会是1,4,7

标签: sql oracle


【解决方案1】:

您可以使用group byhaving

with a as (
      select 1 as attribute_id from dual union all
      select 4 as attribute_id from dual
     )
select t.animal_id, t.animal
from t join
     a
     on t.attribute_id = a.attribute_id
group by t.animal_id, t.animal
having count(*) = (select count(*) from a);

上面将找到所有具有这些属性的动物任何其他的。如果您想要具有这两个属性的动物:

with a as (
      select 1 as attribute_id from dual union all
      select 4 as attribute_id from dual
     )
select t.animal_id, t.animal
from t left join
     a
     on t.attribute_id = a.attribute_id
group by t.animal_id, t.animal
having count(*) = (select count(*) from a) and
       count(*) = count(a.attribute_id);

【讨论】:

  • 具有 1 和 4 的查询不会是特定的,它可以很容易地返回 2 和 5,我们想知道它指的是一条鱼。所以选择的硬编码将不起作用
  • @Santi 。 . .您只需将 a 替换为任何属性即可。它们在一个表中,因此只需使用with 之后的部分即可。
  • 我认为你想要一个内连接 - 第一个查询返回所有 3 只动物,即使“鱼”不匹配任何条件并且“猫”只匹配 1 - 由于左连接,任何动物您正在搜索的相同数量的条件将匹配。但我喜欢这种方法。
猜你喜欢
  • 1970-01-01
  • 2020-06-14
  • 2021-12-26
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 2016-02-19
  • 1970-01-01
  • 2015-11-09
相关资源
最近更新 更多