Найти непересекающиеся множества в таблице с вложенной таблицей colum sql oracle - PullRequest
2 голосов
/ 30 марта 2012

это примеры данных:

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 таблицы.

Некоторая идея о том, как это сделатьэто без подзапроса, я думаю, что это можно сделать с помощью объединения с той же таблицей, но я не знаю, как это сделать.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 30 марта 2012

Я предпочитаю ваш подзапрос, сам.Но альтернатива:

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 голос
/ 30 марта 2012

Запрос «не существует» может быть выражен как соединение с использованием шаблона против объединения.

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

Идея состоит в том, чтобы попытаться выполнить внешнее самостоятельное объединение с использованием того же условия.поскольку внутри вашего не существует предложения, а затем в предложении where сохраняются только строки, в которых такого объединения не было.

Обычно я использую первичный ключ в предложении where.Требуется, чтобы в столбце не допускались значения NULL (чтобы вы могли сказать, что совпадений не было).

Использование анти-объединения иногда быстрее, и это может прояснить, какие индексы могут помочь, ночтение также может быть затруднительным, если вы не знакомы с шаблоном.

0 голосов
/ 30 марта 2012

Не проверено, но это может быть то, что вы ищете:

select d1.courses
from department d1
cross join department d2
where d1.courses<> d2.courses 
and d1.courses not submultiset of d2.courses;
...