单例选择中的 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 多行的主要内容,如果未能解决你的问题,请参考以下文章

ORA-19279: XPTY0004 - XQuery 动态类型不匹配: 多行具有相同名称的预期单例序列

项目中的单例如何管理

c#中sql-connection类上单例模式的实现

单例模式获取JDBC连接

封装jdbc 单例模式的应用

单例模式的“诱惑”