我使用在线资源管理器(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包含足够的所需数据(否则,它的稀疏)
- 三江源 这一般是怎么做的? 这是资源管理器/在线界面的限制..?
答案 0 :(得分:1)
这是“set-within-sets”查询的示例。我想使用group by
和having
:
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'
此查询将形成三个不同的集合,然后返回它们的交集。至少对我来说,在进行关系数据库查询时,考虑集合通常是有帮助的(尽管解决方案可能不是最有效的)。