如何解决如何查询具有相同值的项目
| 我正在寻找一种查询具有相同值集的项目的有效方法。 我有一张桌子C_1 C_2
--------
A 1
A 2
-------
B 1
B 2
B 3
-------
C 1
C 2
-------
D 1
D 2
D 3
-------
E 1
E 2
-------
F 0
F 2
我将从C_1中选择与给定项目具有完全相同的c_2元素集的项目列表。
对于项目A,我将拥有
C
E
对于项目B,我将拥有
D
如何在SQL(Oracle 10g)中完成?
这是用于测试目的的create table语句
create table t (c_1 varchar2(1),c_2 number);
INSERT into t VALUES(\'A\',1);
INSERT into t VALUES(\'A\',2);
INSERT into t VALUES(\'B\',1);
INSERT into t VALUES(\'B\',3);
INSERT into t VALUES(\'C\',1);
INSERT into t VALUES(\'C\',2);
INSERT into t VALUES(\'D\',1);
INSERT into t VALUES(\'D\',3);
INSERT into t VALUES(\'E\',1);
INSERT into t VALUES(\'E\',2);
INSERT into t VALUES(\'F\',0);
INSERT into t VALUES(\'F\',2);
解决方法
您可以使用10g的
COLLECT
功能;因为您不想看到c_2的值,所以甚至不需要ѭ5_2。
select c_1
from t
where c_1 != \'A\'
group by c_1
having collect(c_2) = (select collect(c_2) from t where c_1 = \'A\' group by c_1)
/
, create type t_c_2 as table of number;
select one.c_1,two.c_1
from (select t.c_1,CAST(COLLECT(t.c_2) as t_c_2) coll
from t
group by t.c_1) one,(select t.c_1,CAST(COLLECT(t.c_2) as t_c_2) coll
from t
group by t.c_1) two
where one.coll = two.coll
and one.c_1 != two.c_1;
我从未在生产现场使用过这种结构,因此需要进行效率验证。
, 您所需要的可以通过一个部门来实现:
http://en.wikipedia.org/wiki/Relational_algebra#Division_.28.C3.B7.29
或类似的问题:
SQL中有集合除法吗?
不幸的是,使用关系表达式很难用SQL表示除法。
, SELECT
[search].c_1,[match].c_1
FROM
t AS [search]
INNER JOIN
t AS [match]
ON [search].c_2 = [match].c_2
GROUP BY
[search].c_1,[match].c_1
HAVING
COUNT(*) = (SELECT COUNT(*) FROM t WHERE c_1 = [search].c_1)
AND COUNT(*) = (SELECT COUNT(*) FROM t WHERE c_1 = [match].c_1)
为了获得最佳性能,您需要两个索引。一个在c_1
上,另一个在c_2
上。
-ѭ9上的索引使两个SELECT COUNT(*)
查询成为简单的索引查找。
-ѭ10上的索引使联接查找。
您可以添加AND [search].c_1 != [match].c_1
来停止匹配的集合。
, 像这样的东西:
SELECT DISTINCT c_1
FROM (SELECT c_1,c_2,COUNT(*) over(PARTITION BY c_1) cnt FROM t)
WHERE (SELECT MAX(c_2) FROM t WHERE c_1 = \'A\') = cnt
AND c_1 <> \'A\'
不确定性能,您可以尝试对其进行少许调整,告诉我是否可行
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。