sql多次选择同一列(使用在线oracle资源管理器)

时间:2014-03-19 00:31:16

标签: sql oracle

我使用在线资源管理器(oracle)对数据库进行探索性访问,一次只返回1000条记录。

因此,我需要确保返回的数据包含足够的子集

作为基本示例,tableA包含列

id chartid
1    a
1    b
1    c
2    d
2    b


select id
from tableA
where chartid in (a,d)
  and chartid in (b)
  and chartid in (c)

应该返回

id
1

我想确保我然后运行查询的ID包含足够的所需数据(否则,它的稀疏)

- 三江源 这一般是怎么做的? 这是资源管理器/在线界面的限制..?

2 个答案:

答案 0 :(得分:1)

这是“set-within-sets”查询的示例。我想使用group byhaving

来解决这些问题
select id
from TableA
group by id
having sum(case when chartid in ('a', 'd') then 1 else 0 end) > 0 and
       sum(case when chartid in ('b') then 1 else 0 end) > 0 and
       sum(case when chartid in ('c') then 1 else 0 end) > 0;

having子句中的每个条件都计算符合每个条件的给定id的行数。 > 0保证至少存在满足每个条件的一行。

编辑:

我实际上并不确定你的条件是什么,因为它不符合你遇到的所有三个条件。如果您只想见其中一个,则使用or。如果你想要三个中的两个,那么使用:

having (max(case when chartid in ('a', 'd') then 1 else 0 end) +
        max(case when chartid in ('b') then 1 else 0 end) +
        max(case when chartid in ('c') then 1 else 0 end)
       ) >= 2;

答案 1 :(得分:1)

Gordon Linoff提供的答案可能是最好的,但仅供参考,这种问题的一般方法是将其分解为较小的部分(即形成多个集合),然后加入它们。看起来像这样:

select t1.id 
from tableA t1 
inner join tableA t2 on t1.id = t2.id
inner join tableA t3 on t1.id = t3.id
where 
  t1.chartid in ('a','d')  
  and t2.chartid = 'b'
  and t3.chartid = 'c'

此查询将形成三个不同的集合,然后返回它们的交集。至少对我来说,在进行关系数据库查询时,考虑集合通常是有帮助的(尽管解决方案可能不是最有效的)。

Sample SQL Fiddle with both queries