2012-10-06 2 views
0

Это делается в sql oracle, используя ТОЛЬКО заданные операторы, а не IN, IN, NOT EXISTS, EXISTS, ANY, ALL.Операторы набора SQL

База данных:

Department(DeptNum, Descrip, Instname, DeptName, State, Postcode) 
Academic(AcNum, DeptNum*, FamName, GiveName, Initials, Title) 
Paper(PaNum, Title) 
Author(PaNum*, AcNum*) 
Field(FieldNum, ID, Title) 
Interest(FieldNum*, AcNum*, Descrip) 

Возникает вопрос:

Найти столбец DEPTNUM Описаны и InstName отделов в Квинсленд (КЛД или КЛД), где никто не авторство бумаги.

Моя текущая попытка просто выяснить, отделы, где никто не авторством бумагу вообще независимо от того, в каком состоянии они из

SELECT department.deptNum, department.state, department.instname 
FROM department, academic 
WHERE department.deptnum = academic.deptnum 
    AND NOT EXISTS 
    (SELECT * 
    FROM author 
    WHERE acnum = academic.acnum); 

но, видимо, он должен возвращать только 1 кортеж. Я получаю 3 1 из которых - QLD. Если я пытаюсь удалить другие 2 путем добавления

AND department.state = 'QLD' OR department.state = 'Qld' 

между пунктом WHERE и AND NOT EXISTS, я получаю слишком много результатов.

Любой, кто может помочь мне решить проблему?

+0

[Домашний тег устарел] (http://meta.stackexchange.com/questions/147100/the-homework-tag-is-now-officially-deprecated) Пожалуйста, не используйте. –

+0

Извините, не знал. – bigubosu

ответ

1

AND связывает крепче, чем OR, так

A and B or C 

интерпретируется как

(A and B) or C 

не

A and (B or C) 

Так что вам нужно поставить скобку. Или вы могли бы использовать in:

AND department.state IN ('QLD', 'Qld') 
+0

Спасибо, что строка AND вы написали, добрались до 1 кортежа. Мое мышление на правильном пути? – bigubosu

+0

У вас будет проблема, если у вас есть отдел Квинсленда с более чем одним академиком, и никто из них не опубликовал: информация этого отдела будет в результирующем наборе более одного раза. – Mat

1

Это неправильно:

WHERE department.deptnum = academic.deptnum 
AND department.state = 'QLD' 
OR department.state = 'Qld' 

, потому что она возвращает: 1. данные, отфильтрованные по первому и второму условию 2. данные отфильтрованы по третьему условию без «отдела. deptnum = academ.deptnum ".

Подумайте о скобках.

Вы должны сделать это так:

WHERE department.deptnum = academic.deptnum 
AND (department.state = 'QLD' OR department.state = 'Qld') 

Или так:

WHERE department.deptnum = academic.deptnum 
AND upper(department.state) = 'QLD' 

UPPER ('строка') является Oracle/PLSQL функция совместим с 8i и более новыми версиями и изменяет все символов в верхнем регистре.

Последний вариант является лучшим, поскольку данные могут содержать «Qld», «qld» и «QLD» (любая комбинация верхнего и нижнего регистра).

Для лучшего внешнего вида данных, вы можете также использовать верхний ('строка') здесь:

SELECT department.deptNum, upper(department.state), department.deptname 

EDIT - ответ на комментарий # 1.

«НЕ СУЩЕСТВУЕТ» - это плохая идея для разных строк данных.

Ваш основной выбор состоит из 3 столбцов: department.deptNum, department.state, department.instname Ваш выбор, используемый для фильтрации по автору, имеет 2 столбца.

Попробуйте это решение:

SELECT 
    department.deptNum, 
    department.state, 
    department.instname 

FROM 
    department, 
    academic 
WHERE 
    department.deptnum = academic.deptnum AND 
    upper(department.state) = 'QLD' AND 
    (SELECT count(*) FROM author WHERE acnum = academic.acnum) = 0; 
+0

Спасибо. Хотя я думаю, что логика неправильна где-то в моем решении, я получаю другой результат для кого-то другого, но мы оба получаем 1 кортеж. – bigubosu

+0

Теперь взгляните на конец ответа (я ответил на этот комментарий). – Kamil

+0

Я добавил решение попробовать. – Kamil

0

Я понял это, как получить другой отдел.

Я удалил естественное соединение и сломал все это по частям.

Сначала я получаю атрибуты, которые я хочу отобразить из таблицы отдела. Затем я отфильтровываю результаты, чтобы показывать только QLD/Qld. Затем я использовал «NOT IN», который я использовал в качестве моей ссылки на академическую таблицу, а затем вложил другой оператор набора «IN» для ссылки на таблицу автора. Я отправлю полное решение, когда истечет срок.

, но в значительной степени единственное, что помогло мне, это сделать это по частям. Естественное соединение действительно смутило мое мышление обо всем этом.

Смежные вопросы