【问题标题】:How can I fix ORA-01427: single-row subquery returns more than one row?如何修复 ORA-01427:单行子查询返回多行?
【发布时间】:2015-07-04 22:58:40
【问题描述】:

CREATE TABLE 客户(id_customer NUMBER PRIMARY KEY,名称 VARCHAR2(10), 姓 VARCHAR2(20));

创建表 customer_wer ( id_customer 编号, 名称 VARCHAR2(10), 姓 VARCHAR2(20), data_from DATE, data_to 日期不为空, 约束 customer_wer_pk 主键(id_customer,data_from), 约束 customer_wer_fk 外键 (id_customer) REFERENCES 客户 (id_customer));

SELECT COUNT(customer.id_customer) FROM customer JOIN customer_wer ON customer.id_customer = customer_wer.id_customer WHERE (SELECT customer_wer.id_customer FROM customer_wer JOIN customer ON customer_wer.id_customer = customer.id_customer GROUP BY customer.id_customer) >= 8;

'customer' 表中有 5 个客户,'customer_wer' 中有 48 个职位。 'customer' 表中的每个客户在 'customer_wer' 表中都有 8 个相关职位。我想知道有多少客户在“customer_wer”中有 8 个或更多相关职位。如何使用选择来做到这一点?

提前谢谢你。

【问题讨论】:

  • 您究竟想要查询做什么?
  • 我有两张桌子。一个只包含客户,第二个包含客户订单。我想知道有多少客户的订单超过 8 个。

标签: sql


【解决方案1】:

例如,您可以使用MAX

SELECT COUNT(customer.id_customer) 
  FROM customer JOIN customer_wer
    ON customer.id_customer = customer_wer.id_customer
 WHERE (SELECT MAX (customer_wer.id_customer) 
          FROM customer_wer JOIN customer
            ON customer_wer.id_customer = customer.id_customer
         GROUP BY customer.id_customer) >= 8;

或者 - 如果可能更好 - 为您的子选择添加一些条件,以便它返回一个唯一的结果。

另一种选择,如果要检查子查询返回的行是否为8,则使用IN运算符:

SELECT COUNT(customer.id_customer) 
  FROM customer JOIN customer_wer
    ON customer.id_customer = customer_wer.id_customer
 WHERE 8 IN (SELECT customer_wer.id_customer
               FROM customer_wer JOIN customer
                 ON customer_wer.id_customer = customer.id_customer
              GROUP BY customer.id_customer);

或使用EXISTS 并将条件>= 8 移动到子查询中:

SELECT COUNT(customer.id_customer) 
  FROM customer JOIN customer_wer
    ON customer.id_customer = customer_wer.id_customer
 WHERE EXISTS (SELECT customer_wer.id_customer
                 FROM customer_wer JOIN customer
                   ON customer_wer.id_customer = customer.id_customer
                WHERE customer_wer.id_customer >= 8
                GROUP BY customer.id_customer);

附言:(根据最新评论添加)

SELECT COUNT(c1.id_customer) 
  FROM customer c1
 WHERE 2 <= (SELECT COUNT (cw1.id_customer)
               FROM customer_wer cw1
              WHERE c1.id_customer = cw1.id_customer);

【讨论】:

  • 添加 'MAX' 不起作用。 'Distinct' 也行不通。子查询必须返回几个位置。问题是我如何将几个位置与数字“8”进行比较?例如,客户有一些订单,每个客户可以有很少的订单,如何只选择有 8 个订单的客户?
  • IN 运算符不工作吗?听起来可以....如果不是:为什么?如果你需要&gt;= 8EXISTS 应该没问题
  • 两种解决方案的结果都是 0,结果应该是 6。
  • 你是指整个SELECT吗?您可以先检查子查询(取最后一条语句)。如果它没有返回结果,则可能没有带有customer_wer.id_customer &gt;= 8 的行。
  • 带有“customer_wer.id_customer >= 8”的子查询不返回任何行。我的子查询 'SELECT COUNT(klient_wer.id_klienta) FROM klient_wer JOIN klient ON klient_wer.id_klienta = klient.id_klienta GROUP BY klient.id_klienta' 结果 6 行的值为 8。我需要将这 6 行与数字 '8' 进行比较主查询,结果应该是“6”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 2017-11-02
  • 1970-01-01
  • 1970-01-01
  • 2014-06-24
  • 1970-01-01
相关资源
最近更新 更多