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 句では主キーを使用します。列が null を許可しないことが必要です (一致がなかったことがわかるようにするため)。

アンチ結合を使用する方が高速な場合があり、どのインデックスが役立つかを明確にすることができますが、パターンに慣れていない場合は読みにくくなる可能性もあります。

于 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 に答える