【问题标题】:SQL Query Error: "sub-select returns 2 columns - expected 1" when trying to match either of two columns of subquerySQL 查询错误:尝试匹配子查询的两列中的任何一列时,“子选择返回 2 列 - 预期为 1”
【发布时间】:2021-07-07 03:04:18
【问题描述】:

当我编写以下查询时:

SELECT name
FROM people
WHERE phone_number IN 
(SELECT caller, receiver FROM phone_calls WHERE month = 7 AND day = 28 AND year = 2020 AND duration < 60);

我收到以下错误:sub-select 返回 2 列 - 预期为 1

不确定问题出在哪里... 来电者是带有电话号码的 TEXT。
接收者是带有电话号码的文本。 我的目标是创建一个列表,而不是向我显示呼叫者和接收者的电话号码,而是向我显示他们的姓名。

另外,这是我在 CS50 五十维尔的尝试。

【问题讨论】:

    标签: sql cs50 querying


    【解决方案1】:

    您不了解错误的哪一部分? in 的子查询只能有一列。

    在您的情况下,我认为您希望任一列都匹配。所以,请改用exists

    SELECT p.name
    FROM people p
    WHERE EXISTS (SELECT 1
                  FROM phone_calls pc
                  WHERE pc.month = 7 AND pc.day = 28 AND pc.year = 2020 AND
                        pc.duration < 60 AND
                        p.phone_number IN (pc.caller, pc.receiver)
                 );
    

    【讨论】:

    • 谢谢,但我想我正在寻找类似的东西; ` SELECT (SELECT name FROM people WHERE phone_number IN (SELECT caller FROM phone_calls WHERE month = 7 AND day = 28 AND year = 2020 AND duration
    【解决方案2】:

    在这种情况下,您不能只使用 JOIN 而不是子查询吗?顺带一提:

    SELECT name
    FROM people
    INNER JOIN phone_calls
      ON people.phone_number IN (
        phone_calls.caller,
        phone_calls.receiver
      )
      AND phone_calls.month = 7
      AND phone_calls.day = 28
      AND phone_calls.year = 2020
      AND phone_calls.duration < 60
    

    这不适用于 UPDATE/DELETE,因为不幸的是它们不支持 SQLite 中的 JOIN,在这些情况下,我不知道如何避免 Gordon 提出的相关子查询:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多