【问题标题】:SQL Statement issues (Not IN)SQL 语句问题(不在)
【发布时间】:2018-11-06 06:43:56
【问题描述】:

完成一项 uni 作业(直到最后期限),无法弄清楚我如何/为什么误用 NOT IN 功能。

SELECT DISTINCT P1.TITLE, P1.PANUM, D1.POSTCODE
FROM PAPER P1
INNER JOIN AUTHOR A1 ON A1.PANUM = P1.PANUM
INNER JOIN ACADEMIC A2 ON A2.ACNUM = A1.ACNUM
INNER JOIN DEPARTMENT D1 ON D1.DEPTNUM = A2.DEPTNUM
WHERE P1.PANUM NOT IN(
    SELECT DISTINCT P1.TITLE, P1.PANUM, D1.POSTCODE
    FROM PAPER P1
    INNER JOIN AUTHOR A1 ON A1.PANUM = P1.PANUM
    INNER JOIN ACADEMIC A2 ON A2.ACNUM = A1.ACNUM
    INNER JOIN DEPARTMENT D1 ON D1.DEPTNUM = A2.DEPTNUM
    WHERE D1.POSTCODE LIKE '4%'
)
ORDER BY P1.PANUM;

目的是创建一个 P1.TITLE 列表,从 4 开始的邮政编码中没有作者。

我收到 ORA-00913: Too Many Values 错误,我不知道为什么。

【问题讨论】:

  • 也许你想不存在?

标签: sql oracle


【解决方案1】:

只关注你的问题:

目的是创建一个 P1.TITLE 列表,其中没有作者来自 从 4 开始的邮政编码。

你可以这样做:

SELECT TITLE, PANUM
FROM PAPER
WHERE NOT EXISTS (
    SELECT 1
    FROM AUTHOR
    INNER JOIN ACADEMIC ON AUTHOR.ACNUM = ACADEMIC.ACNUM
    INNER JOIN DEPARTMENT ON ACADEMIC.DEPTNUM = DEPARTMENT.DEPTNUM
    WHERE AUTHOR.PANUM = PAPER.PANUM
    AND DEPARTMENT.POSTCODE LIKE '4%'
)
ORDER BY PANUM

【讨论】:

  • 我对你的修改的问题是一些论文有来自不同州的多个作者,所以如果有来自其他州的作者,论文的记录会保留在结果中。
【解决方案2】:

您必须在内部子查询中选择一列

SELECT DISTINCT P1.TITLE, P1.PANUM, D1.POSTCODE
FROM PAPER P1
INNER JOIN AUTHOR A1 ON A1.PANUM = P1.PANUM
INNER JOIN ACADEMIC A2 ON A2.ACNUM = A1.ACNUM
INNER JOIN DEPARTMENT D1 ON D1.DEPTNUM = A2.DEPTNUM
WHERE P1.PANUM NOT IN(
    SELECT  P1.PANUM
    FROM PAPER P1
    INNER JOIN AUTHOR A1 ON A1.PANUM = P1.PANUM
    INNER JOIN ACADEMIC A2 ON A2.ACNUM = A1.ACNUM
    INNER JOIN DEPARTMENT D1 ON D1.DEPTNUM = A2.DEPTNUM
    WHERE D1.POSTCODE LIKE '4%'
)
ORDER BY P1.PANUM;

【讨论】:

  • @MarkBrealey:确保子查询不返回任何 NULL 值
【解决方案3】:

当您使用 IN 和 NOT IN 关键字时,这意味着其中应该只有一个参数(或列)。

【讨论】:

    猜你喜欢
    • 2010-09-25
    • 1970-01-01
    • 2015-10-15
    • 2010-10-11
    • 2011-04-23
    • 2018-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多