首页 > 解决方案 > Saclar 子查询产生了多个元素

问题描述

我有桌子

客户1

+----+------+-------------+
| 身份证 | 姓名 | 参考ID |
+----+------+-------------+
| 1 | 啊!|
| 2 | bbb | 1 |
| 3 | 抄送 | 2 |
| 4 | dd | 2 |
| 5 | eee | 4 |
+----+------+-------------+
发票

+-----+--------------+---------+
| 身份证 | 帐单日期 | cust_id |
+-----+--------------+---------+
| 101 | 01-02-2017 | 1 |
| 102 | 01-03-2017 | 2 |
| bbb | 01-04-2017 | 3 |
+-----+--------------+---------+

我需要输出为

+-----+--------------+------------+---------------+
| 身份证 | 帐单日期 | 客户名 | 被提及的名称 |
+-----+--------------+------------+---------------+
| 101 | 01-02-2017 | 啊!|
| 102 | 01-03-2017 | bbb | 啊!
| bbb | 01-04-2017 | 抄送 | bbb |
+-----+--------------+------------+---------------+
Select c.id,
i.billing_date,
c.name,
(select
b.name as referred_name
from cust1 a left join cust1 b on a.referred_id=b.id)
from cust1 c, invoice i where c.id=i.cust_id

上面的查询抛出错误,因为标量子查询产生了多个元素。有人可以看看这个。

谢谢

标签: sql

解决方案


您的主要问题是您的子查询不相关。在您的主查询中,您处理表cust1aliasedcinvoicealiased i,但在您的子查询中,您没有引用c或根本没有引用i

看来你想要:

select
  c.id, i.billing_date, c.name,
  (
    select cr.name
    from cust1 cr
    where cr.id = c.referred_id
  ) as referred_name
from invoice i 
join cust1 c on c.id = i.cust_id
order by c.id, i.billing_date;

您可以通过外连接实现相同的目的:

select c.id, i.billing_date, c.name, cr.name as referred_name
from invoice i 
join cust1 c on c.id = i.cust_id
left join cust1 cr on cr.id = c.referred_id
order by c.id, i.billing_date;

这两个查询都是标准 SQL,并且非常基础。我假设它们也可以在您的环境中运行。


推荐阅读