【问题标题】:single-row subquery returns more than one row Oracle Database单行子查询返回多行 Oracle 数据库
【发布时间】:2015-11-01 19:40:31
【问题描述】:

我有两张桌子,即 PESANMASUK 和 KONTAK。在 PESANMASUK 我有 5 个文件:IDMASUK、TANGGALMASUK、JAM、NOMERHP、ISIPESAN。 和 KONTAK 我有 3 个文件:IDKONTAK、NAMA、NOHP

PESANMASUK 表数据:

IDMASUK TANGGALMASUK    JAM     NOMERHP     ISIPESAN
1       09/08/2015      09:00   +62847776   try sms
2       08/08/2015      10:00   +62856790   plase come in
3       08/08/2015      06:00   +6283444    you and me

KONTAK 表数据:

IDKONTAK    NAMA        NOHP
1           RIAN        +62847776
2           ALFIAN      +62856790

这个结果是我想要的:

IDMASUK TANGGALMASUK    JAM     NOMERHP     NAMA        ISIPESAN
1       09/08/2015      09:00   +62847776   RIAN        try sms
2       08/08/2015      10:00   +62856790   ALFIAN      plase come in
3       08/08/2015      06:00   +6283444                you and me

这是我的 oracle 查询:

SELECT IDMASUK, TANGGALMASUK, JAM, NOMERHP, ISIPESAN, 
(SELECT NAMA FROM KONTAK WHERE NOHP IN (SELECT NOMERHP FROM PESANMASUK)) AS NAMA 
FROM PESANMASUK

我收到这样的错误:

ORA-01427: single-row subquery returns more than one row

我想在 PESANMASUK 中的 NOMERHP 和 KONTAK 中的 NAMA 之间进行匹配并返回所有行。

我该如何解决这个问题??

【问题讨论】:

  • 请使用示例数据和所需结果编辑您的问题。
  • @GordonLinoff 我已经为我的问题进行了编辑,..请建议我如何解决这个问题,..我在下面使用 listagg() 尝试了您的查询,但 NAMA 仍然有空白结果..

标签: c# sql oracle11g


【解决方案1】:

正如错误所说,子查询返回不止一行。这里有两种解决方法:

SELECT IDMASUK, TANGGALMASUK, JAM, NOMERHP, ISIPESAN, 
       (SELECT MAX(NAMA) FROM KONTAK WHERE NOHP IN (SELECT NOMERHP FROM PESANMASUK)) AS NAMA 
FROM PESANMASUK;

或:

SELECT IDMASUK, TANGGALMASUK, JAM, NOMERHP, ISIPESAN, 
       (SELECT NAMA FROM KONTAK WHERE NOHP IN (SELECT NOMERHP FROM PESANMASUK WHERE ROWNUM = 1)) AS NAMA 
FROM PESANMASUK;

不过,我的猜测是,您想要的既不是您想要的,也是您真正想要的相关子查询:

SELECT IDMASUK, TANGGALMASUK, JAM, NOMERHP, ISIPESAN, 
       (SELECT k.NAMA FROM KONTAK k WHERE k.NOHP = p.NOMERHP) AS NAMA 
FROM PESANMASUK p

编辑:

要获取所有名称,可以使用listagg()

SELECT IDMASUK, TANGGALMASUK, JAM, NOMERHP, ISIPESAN, 
       (SELECT LISTAGG(k.NAMA, ',') WITHIN GROUP (ORDER BY k.NAMA)
        FROM KONTAK k
        WHERE k.NOHP = p.NOMERHP) AS NAMA 
FROM PESANMASUK p

【讨论】:

  • 我想匹配两个表之间的所有值,如下所示:[1, 10/08/09, +620522611111, RIAN, TES], [2, 10/08/09, +6283888888, FIAN ,试试短信]。 rian 和 fian 来自 KONTAK 表,该表与 PESANMASUK 表中的 NOMERHP 匹配
  • 您建议的最后一个查询是我想要的,返回查询中的所有行。但它仍然不起作用。错误是相同的ORA-01427: single-row subquery returns more than one row
  • 您可以在子查询中添加and rownum = 1
  • 如果我添加 rownum = 1,它将只产生一个名称(NAMA)而不是全部,..在这种情况下,我将显示 kontak 表中与 pesanmasuk NOMERHP 匹配的所有名称
  • 使用LISTAGG() 几乎完成了,..query woks....但是 NAMA 仍然是空白结果,...但它帮助了我,..我得到了一个线索....跨度>
【解决方案2】:

试试这个。:)

即使右表没有匹配的数据,左连接也会获取左表的详细信息或行。

请浏览下面的链接以获取有关左连接的更多信息。 http://www.w3schools.com/sql/sql_join_left.asp

select idmasuk, tanggalmasuk, jam, nomerhp, nama, isipesan
from 
pesanmasuk
left join kontak
on pesanmasuk.nomerhp = kontak.nohp;

希望对您有所帮助。干杯! :)

【讨论】:

  • 是的,这行得通....谢谢,...两个表之间没有关系,但是使用左连接可以工作....很好...
  • 不客气。谢谢你让我知道结果。很高兴我能帮助你。 :D
猜你喜欢
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 2020-12-20
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-25
相关资源
最近更新 更多