2012-10-06 53 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(QLD或昆士兰)。

我现在的尝试是刚刚弄清楚那里没有一个人撰写的论文根本不管他们是什么状态从

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。如果我试图通过添加

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

WHERE子句之间,除去其他2 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

谢谢,你写的这行代码把它归结为1元组。我的思路是否正确? – bigubosu

+0

如果您的昆士兰州有多个学术部门,而且他们都没有发布过,那么您会遇到问题:该部门的信息将不止一次出现在结果集中。 – Mat

1

这是错误的:

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

,因为它返回:由第一和第二个条件 2.数据没有“部门通过第三个条件筛选过滤 1.数据。 deptnum = academic.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功能compatibile与8i和更新版本,它改变了一切字符改为大写。

最后一个选项是最好的,因为数据可能包含'Qld','qld'和'QLD'(大写和小写的任意组合)。

为了更好看的数据,你也可以使用上( '字符串')在这里:

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

编辑 - 答案对此事发表评论#1。

“NOT EXISTS”对于不同的数据行是个坏主意。

您的主要选择有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”集操作符链接到作者表。当到期日过后,我会发布完整的解决方案。

但几乎所有帮助我的是做点点滴滴。天生的加入让我对这一切的想法感到困惑。