单行子查询返回多个行 Oracle数据库

3
我可以翻译以下内容:

我有两个表,分别是 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进行匹配,并返回所有行。
我该如何解决这个问题?

请在您的问题中编辑示例数据和期望结果。 - Gordon Linoff
@GordonLinoff 我已经编辑了我的问题,请建议如何解决。我尝试使用listagg()运行您下面的查询,但NAMA仍然没有结果。 - aminvincent
2个回答

1

试一下这个:)

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

请浏览以下链接以了解有关左连接的更多信息。 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;

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

是的,这个可以工作...谢谢...两个表之间没有关联,但使用左连接可以解决...很好... - aminvincent
不用谢。感谢你让我知道结果。很高兴能帮到你。 :D - user3462803

0

正如错误所述,子查询返回了多行。以下是两种解决方法:

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,TRY SMS]。RIAN和FIAN来自KONTAK表,该表与PESANMASUK表中的NOMERHP匹配。 - aminvincent
你建议的最后一个查询是我想要的,返回查询中的所有行。但它仍然无法工作。错误仍然是 ORA-01427: single-row subquery returns more than one row - aminvincent
你可以在子查询中添加 and rownum = 1 - Gordon Linoff
如果我添加rownum = 1,结果只会显示一个名字(NAMA),而不是全部的名字。在这种情况下,我将显示与pesanmasuk NOMERHP匹配的kontak表中的所有名称。 - aminvincent
使用 LISTAGG() 函数,它几乎完成了,查询也正常运行,但是 NAMA 列仍然为空结果,但是它帮助我找到了线索。 - aminvincent
Gordon Linoff: 我已经更新了我的问题,你能再次帮我解决吗? - aminvincent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接