错误:用作表达式的子查询返回多行。 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 / 查看器的主要内容,如果未能解决你的问题,请参考以下文章
在使用IN子句的postgreSql查询中用作表达式的子查询返回的多行
使用postgre数据库实现树形结构表的子-父级迭代查询,通过级联菜单简单举例