这些是样本数据:
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的子集。
关于如何在没有子查询的情况下做到这一点的一些想法,我认为可以使用同一个表的连接来完成,但我不知道该怎么做。
感谢。
答案 0 :(得分: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;
答案 1 :(得分: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子句中使用主键。要求列不允许空值(以便您可以判断出没有匹配)。
使用反连接有时会更快,并且可以使索引更清晰,但如果不熟悉该模式,也可能会让人感到困惑。
答案 2 :(得分:0)
未经测试,但这可能是您正在寻找的:
select d1.courses
from department d1
cross join department d2
where d1.courses<> d2.courses
and d1.courses not submultiset of d2.courses;