有两张桌子:
)
在对下面的pp_odate查询执行正常的select操作时,as返回多行。
SELECT automic_param
FROM pp_odate
WHERE jobset_id = 'ABC'
AND job_id = 'cba1';但是,如果它作为子查询包含在另一个select语句中,则只返回第一行。
SELECT (
SELECT automic_param
FROM pp_odate
WHERE jobset_id = pp_job.jobset_id
AND job_id = pp_job.job_id
)
FROM pp_job
WHERE pp_job.jobset_id = 'ABC'
AND pp_job.job_id = 'cba1';我不明白为什么会这样。这是相关查询的一个特性吗?是否有任何方法返回第2 select语句中的所有行。
发布于 2022-06-22 04:44:05
执行关联子查询的更正常的方法是首先说出您想从pp_odate中得到的内容,然后在Where子句中引用pp_job,如下所示:
SELECT automic_param
FROM pp_odate od
WHERE (jobset_id, job_id) = (
SELECT j.jobset_id, j.job_id
FROM pp_job j
WHERE j.jobset_id = 'ABC'
AND j.job_id = 'cba1'
);除了在这种情况下,这有点愚蠢,因为您在pp_job中引用的变量与pp_odate中的变量完全相同。假设pp_job查询返回了两个记录,都是('ABC','cba1');这相当于写Where (jobset_id, job_id) = (('ABC','cba1'),('ABC','cba1'))。
这就像您的第一个查询,只是更慢!
还要注意,这甚至不是一个相关的子查询-它根本不引用pp_odate查询中的值。
就像肖恩在评论中说的,‘我认为你真的想加入这里’。
发布于 2022-06-22 05:34:01
子查询在标量上下文中使用,因此它只能返回单个行。任何其他的都会被丢弃(好吧,根本就不算)。
你需要这样的东西
SELECT pp_odate.automic_param
FROM pp_odate
JOIN pp_job ON pp_odate=jobset_id = pp_job.jobset_id
AND pp_odate.job_id = pp_job.job_id
WHERE pp_job.jobset_id = 'ABC' AND pp_job.job_id = 'cba1';从中得到多行信息。
https://stackoverflow.com/questions/72709159
复制相似问题