单例选择中的 SQL 多行
Posted
技术标签:
【中文标题】单例选择中的 SQL 多行【英文标题】:SQL Multiple Rows in Singleton Select 【发布时间】:2018-03-28 14:58:43 【问题描述】:我有以下 SQL:
WITH G1 AS
(SELECT G.NUM_REFE, G.GUIA AS MASTER,
(SELECT H.GUIA FROM SAAIO_GUIAS H WHERE G.NUM_REFE = H.NUM_REFE AND H.IDE_MH ="H" AND H.CONS_GUIA="1" ) AS HOUSE
FROM SAAIO_GUIAS G WHERE G.IDE_MH ="M" AND G.CONS_GUIA ="1" )
SELECT
*
FROM G1
它返回错误
“单例选择中的多行”。
这是一个数据库示例
任何提示将不胜感激
谢谢
【问题讨论】:
内部选择返回多个值 - 因为您使用它在该位置选择单个值,所以它失败了 附注:双引号是名称的分隔符。字符串文字的分隔符是单引号。CONS_GUIA
是数字列吗?那么你根本不应该使用引号:AND H.IDE_MH = 'H' AND H.CONS_GUIA= 1
.
您应该始终使用所使用的 DBMS 标记 SQL 问题。我猜你的引号是 mysql 的错误用法?
谢谢Thorsten,我将其更改为单引号,并且CONS_GUIA 不是数字列。我正在使用 Ibexpert 感谢您的建议
【参考方案1】:
您的查询想要检索匹配的GUIA
,但似乎每个NUM_REFE
可以有多个条目用于IDE_MH = 'H' AND CONS_GUIA = 1
。检查这个
select num_refe
from saaio_guias
where ide_mh = 'H'
and cons_guia = 1
group by num_refe
having count(*) > 1;
这应该没有结果,但它可能会。如果是这样,那么它对您的查询不起作用,您必须考虑在这种情况下选择哪个值。也许只是最小值或最大值:
(
select min(h.guia)
from saaio_guias h
...
或者,也许您想从表中删除您认为重复的行并添加约束(num_refe + ide_mh + cons_guia 上的唯一索引)以防止将来出现此类记录。
顺便说一句,使用条件聚合可以更简单地编写查询:
select
num_refe,
any_value(case when ide_mh = 'M' then guia end) as master,
any_value(case when ide_mh = 'H' then guia end) as guia
from saaio_guias
where cons_guia = 1
group by num_refe
order by num_refe;
【讨论】:
谢谢,我确实检查并没有得到任何结果,这仍然让我想知道为什么会出现错误,因为每个 NUM_REFE 只有一个条目【参考方案2】:问题出在CTE
SELECT
子查询中。
我认为你可以使用CASE
express 代替SELECT
Subquery
WITH G1 AS
(
select
num_refe,
Case when ide_mh = 'M' then GUIA ELSE '' END as MASTER,
Case when ide_mh = 'H' then GUIA ELSE '' END as HOUSE
from saaio_guias
where cons_guia = 1
)
SELECT
*
FROM G1
或
SELECT G.NUM_REFE, G.GUIA AS MASTER,H.GUIA
FROM SAAIO_GUIAS G
INNER JOIN
(
SELECT *
FROM SAAIO_GUIAS
WHERE IDE_MH ='H' AND CONS_GUIA='1'
) AS H ON G.NUM_REFE = H.NUM_REFE
WHERE G.IDE_MH ='M' AND G.CONS_GUIA ='1'
我不知道您的预期结果是什么。所以我想这两个查询可能会对您有所帮助。
【讨论】:
感谢您的回答,但我收到错误 Column unknown H.NUM_REFE @Eduardo 不客气。如果对您有帮助,您可以接受我的回答 :) 我的意思是接受后是meta.stackexchange.com/questions/5234/…。标记好的答案可以帮助遇到同样问题的人找到答案:)以上是关于单例选择中的 SQL 多行的主要内容,如果未能解决你的问题,请参考以下文章