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

时间:2015-08-10 00:56:35

标签: c# sql oracle11g

我有两张桌子,即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之间进行匹配并返回所有行。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分: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;

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

答案 1 :(得分: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