2

这些是样本数据:

CREATE OR REPLACE TYPE CourseList AS TABLE OF VARCHAR2(64);

CREATE TABLE department (
courses  CourseList)
NESTED TABLE courses STORE AS courses_tab;

INSERT INTO department (courses)VALUES (CourseList('1','2','3'));
INSERT INTO department (courses)VALUES (CourseList('4','5','7'));
INSERT INTO department (courses)VALUES (CourseList('1','2'));

commit;

 select d1.courses
from department d1
where not exists (select 1 from department d2 
  where d1.courses<> d2.courses and d1.courses submultiset of d2.courses);

commit;

Result:

CourseList(1,2,3)
CourseList(4,5,7)

查询返回正确的数据 CourseList,它们不是表的任何其他 CourseList 的子集。

关于如何在没有子查询的情况下执行此操作的一些想法,我认为可以使用连接同一张表来完成,但我不知道该怎么做。

谢谢。

4

3 回答 3

2

我自己更喜欢你的子查询。但另一种选择是:

select d.courses
from department d
MINUS
select d2.courses
from department d2, department d1
where d1.courses<> d2.courses
and d1.courses submultiset of d2.courses;
于 2012-03-30T01:40:32.473 回答
1

“不存在”查询可以表示为使用反连接模式的连接。

select d1.courses
from department d1
left join department d2
   on d1.courses <> d2.courses
  and d1.courses submultiset of d2.courses
where d2.sources is null

这个想法是尝试使用与not exists子句内部相同的条件进行外部自连接,然后在 where 子句中仅保留不存在此类连接的行。

我通常在 where 子句中使用主键。要求该列不允许空值(这样您就可以知道没有匹配项)。

使用反连接有时会更快,并且它可以更清楚地说明哪些索引可能会有所帮助,但如果不熟悉该模式,也可能会令人困惑。

于 2012-03-30T02:16:11.880 回答
0

未经测试,但这可能是您正在寻找的:

select d1.courses
from department d1
cross join department d2
where d1.courses<> d2.courses 
and d1.courses not submultiset of d2.courses;
于 2012-03-30T02:49:25.047 回答