我有两张桌子,即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之间进行匹配并返回所有行。
我该如何解决这个问题?
答案 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