Postgresql查询仅连接匹配模式的第一行

时间:2016-02-16 14:55:48

标签: sql postgresql

我需要添加字段 ovr.riga ,这应该是许多人的第一个匹配,所以我创建一个子查询来获取应该考虑的 progressivo 列表,但是postresql抱怨

  

子查询返回多行

SELECT
    ovr.progressivo,
    ovr.art_codice,
    ovr.descrizione1,
    ovr.descrizione2,
    ovr.riga
FROM ovr
WHERE ovr.progressivo = (
    SELECT progressivo
    FROM ovr
    WHERE
        ovr.art_codice ~~ '0034%'::text OR
        ovr.art_codice ~~ '0035%'::text OR
        ovr.art_codice ~~ '0036%'::text
    group by progressivo
)

子查询单独运行

2 个答案:

答案 0 :(得分:0)

只需将=替换为in

where ovr.progressivo in (

如果你只想要(无论如何)第一个:

select distinct on (ovr.progressivo)
    ovr.progressivo,
    ovr.art_codice,
    ovr.descrizione1,
    ovr.descrizione2,
    ovr.riga
from ovr
where ovr.progressivo in (
    select progressivo
    from ovr
    where
        ovr.art_codice ~~ '0034%'::text or
        ovr.art_codice ~~ '0035%'::text or
        ovr.art_codice ~~ '0036%'::text
    group by progressivo
)
order by ovr.progressivo

如果您有一个标准,首先将其添加到order by子句

答案 1 :(得分:0)

“as is”查询包含“where ovr.progressivo =(...)”,其中子查询产生多行。等于运算符无法计算值列表,但IN运算符可以。

尝试使用IN

SELECT
      ovr.progressivo
    , ovr.art_codice
    , ovr.descrizione1
    , ovr.descrizione2
    , ovr.riga
FROM ovr
WHERE ovr.progressivo IN (   --<<<<<<< change = to IN
            SELECT
                  progressivo
            FROM ovr
            WHERE ovr.art_codice -- '0034%'::text 
               OR ovr.art_codice -- '0035%'::text
               OR ovr.art_codice -- '0036%'::text
            GROUP BY
                  progressivo
      )
;

如果这样可以解决错误,那么您需要决定所需的结果行,并使用ORDER BY和LIMIT 1来控制结果