错误:用作表达式的子查询返回多行。 POSTGRESQL / 查看器

Posted

技术标签:

【中文标题】错误:用作表达式的子查询返回多行。 POSTGRESQL / 查看器【英文标题】:ERROR: more than one row returned by a subquery used as an expression. POSTGRESQL / LOOKER 【发布时间】:2019-05-29 19:57:33 【问题描述】:

我正在尝试在 Looker 中执行一个子查询,该查询从人员 ID 等于分配给人员 ID 的人员表中返回受让人姓名

我试图做一个限制 1,但这只是为每一行中的人返回第一个值

SELECT 
    "ID",

    (SELECT 
        p."NAME"
    FROM 
        view_321782990.person AS p, view_321782990.request AS r 
    WHERE 
        p."ID" = r."ASSIGNEDTOPERSON") 
FROM view_321782990.request

我希望它返回分配给票证的姓名,正在做

SELECT 
        p."NAME", r."ID"
    FROM 
        view_321782990.person AS p, view_321782990.request AS r 
    WHERE 
        p."ID" = r."ASSIGNEDTOPERSON"

返回我想要的,但是,由于查看器如何解释 SQL,我需要以这种方式执行子查询

【问题讨论】:

听起来您需要使用连接而不是相关子查询。 由于查看器格式化 sql 语句的方式,我必须使用子查询 您尝试创建的 LookML 情况是什么导致了这种情况?解释您要解决的根本目标会很有帮助,因为可能有更好的方法来建模! (SELECT string_agg(p."NAME", ',' from ...) 也许? 【参考方案1】:

使用连接:

SELECT
  p.name
  , r.id
FROM view_321782990.person p
LEFT JOIN view_321782990.request r ON
  p.id = r.assignedtoperson

【讨论】:

我会,但是由于查看器如何创建查询,我需要使用子查询。我需要 SELECT "ID" ... FROM view_321782990.request,除了 SELECT "ID" 和 FROM 之间的内容之外,不能更改任何内容 使用您在问题中提供的信息,您不需要子查询。 我知道它可以通过连接完成(并且应该完成),但我想知道它是否可以通过子查询完成,因为这是 Looker 格式化查询的方式看【参考方案2】:

我认为您可以通过内部查询获得所需的内容,该内部查询由外部查询中的值过滤并将 LIMIT 放回:

SELECT 
    "ID",

    (SELECT 
        p."NAME"
    FROM 
        view_321782990.person AS p, view_321782990.request AS r 
    WHERE 
        p."ID" = r."ASSIGNEDTOPERSON" AND r."ID" = outer_r."ID"
    LIMIT 1
) 
FROM view_321782990.request AS outer_r

其中request."ID"是与p."ID" = r."ASSIGNEDTOPERSON"区分记录的一种方式,这种方式取决于这些表之间的关系,可能并非在所有情况下都可行,这让我想到:

我同意这一普遍共识,即这可以在连接中更轻松地完成。如果浏览器不存在,您可能需要在探索中添加连接,但是一旦视图之间存在连接,您就可以跨视图访问字段,如下所示:

view: request 
  # ... sql_table_name, etc ...
  dimension: person_name 
    sql: $person.name
  
  # ... mode dimensions, measures, etc ...

如果您对生成的 sql 的外观有一个清晰的概念,我会在 how looker generates sql 上查看更多信息,在how joins are handled 上查看更多信息

【讨论】:

以上是关于错误:用作表达式的子查询返回多行。 POSTGRESQL / 查看器的主要内容,如果未能解决你的问题,请参考以下文章

Django - 用作表达式的子查询返回的不止一行

在使用IN子句的postgreSql查询中用作表达式的子查询返回的多行

使用postgre数据库实现树形结构表的子-父级迭代查询,通过级联菜单简单举例

子查询返回多个值错误

子查询返回超过 1 个值。当子查询跟随 = 或子查询用作表达式时,这是不允许的

零基础带你学习MySQL—单行子查询和多行子查询(二十二)