0

这是在 sql oracle 中使用 ONLY 集合运算符完成的,NOT IN、IN、NOT EXISTS、EXISTS、ANY、ALL。

数据库是:

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)

问题是:

查找昆士兰州(昆士兰州或昆士兰州)没有人撰写过论文的部门的部门编号、描述和机构名称。

我目前的尝试是找出根本没有人撰写论文的部门,无论他们来自哪个州

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 之间,我得到了太多结果。

谁能指导我解决问题?

4

3 回答 3

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')
于 2012-10-06T13:43:31.480 回答
1

这是错误的:

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

因为它返回: 1. 按第一个和第二个条件过滤的数据 2. 按第三个条件过滤的数据,没有“department.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('string') 是与 8i 和更新版本兼容的 Oracle/PLSQL 函数,它将所有字符更改为大写。

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

为了更好地查看数据,您还可以在此处使用 upper('string'):

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

编辑 - 回答评论#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;
于 2012-10-06T13:45:12.130 回答
0

我已经弄清楚如何获得其他部门。

我移除了自然连接并将其全部分解。

首先,我从部门表中获取我想要显示的属性。然后我过滤掉结果只显示QLD/Qld。然后我使用了一个“NOT IN”作为我指向学术表的链接,然后嵌套了另一个“IN”集合运算符来链接到作者表。截止日期过去后,我将发布完整的解决方案。

但几乎唯一对我有帮助的就是一点一点地去做。自然加入真的让我对这一切的想法感到困惑。

于 2012-10-06T15:20:58.030 回答