如何解析返回多行的子查询

ruarlubt  于 2021-07-26  发布在  Java
关注(0)|答案(5)|浏览(284)

我在数据库中有三个表,其中第一个表由自由职业者部分组成,第二个表是客户表,第三个表是当客户选择一个自由职业者时,3个表存储了自由职业者的id和客户的id。但是当我想检索客户选择的自由职业者的信息时,会显示上面标题中提到的错误,这里是我的查询

SELECT * FROM `freelancer_detail` 
WHERE f_id = (select freelancer_id 
from shortlisted_freelancers 
where shortlisted_id =(SELECT postJob_id from client_detail 
WHERE client_email = "joshua@gmail.com"))
j0pj023g

j0pj023g1#

如果另一个表中有多个值,请使用in子句,

SELECT * FROM `freelancer_detail` 
WHERE f_id in (select freelancer_id 
from shortlisted_freelancers 
where shortlisted_id  in (SELECT postJob_id from client_detail 
WHERE client_email = "joshua@gmail.com"))
jm2pwxwz

jm2pwxwz2#

用于

SELECT f.* FROM `freelancer_detail` f
WHERE f_id in (select freelancer_id 
from shortlisted_freelancers 
where shortlisted_id in (SELECT postJob_id from client_detail 
WHERE client_email = "joshua@gmail.com")
)
lztngnrs

lztngnrs3#

试试这个:

SELECT * FROM freelancer_detail fd 
    LEFT JOIN shortlisted_freelancers sf ON fd.f_id = sf.freelancer_id
    LEFT JOIN postJob_id pj ON sf.shortlisted_id = pj.postJob_id
WHERE fd.client_email = "joshua@gmail.com"
sg24os4d

sg24os4d4#

尽管目前提交的所有答案看起来都比op代码好,但它们实际上并没有提供原始问题的答案,如何让子查询只返回一行呢。
一个选项是使用selecttop1,但这取决于您是否包含orderby子句,以确保结果集中的第一行是您想要的。
我并不主张你真的这样做,(我认为murat建议的连接更好)像下面这样的东西可以确保子查询只返回一行。

SELECT * FROM `freelancer_detail` 
WHERE f_id = (SELECT TOP 1 freelancer_id 
          FROM shortlisted_freelancers 
          WHERE shortlisted_id = (SELECT TOP 1 postJob_id
                                  FROM client_detail 
                                  WHERE client_email = "joshua@gmail.com"
                                  ORDER BY client_email, postJob_id)
ORDER BY freelancer_id) ---------------
hk8txs48

hk8txs485#

使用 join :

SELECT fd.*
FROM freelancer_detail fd JOIN
     shortlisted_freelancers sf
     ON fd.f_id = sf.freelancer_id JOIN
     client_detail cd
     ON sf.shortlisted_id = cd.postJob_id 
WHERE cd.client_email = 'joshua@gmail.com';

笔记:
始终限定所有列引用,尤其是当查询引用多个表时。
使用表别名,因此查询更易于编写和读取。
字符串的标准sql分隔符是单引号,而不是双引号。
你也应该知道 join s通常比 in s。

相关问题