sql子查询!基本 sql 查询中 ANY 运算符的问题。不知道为啥在我的查询中需要它以及它将如何工作?

Posted

技术标签:

【中文标题】sql子查询!基本 sql 查询中 ANY 运算符的问题。不知道为啥在我的查询中需要它以及它将如何工作?【英文标题】:sql subqueries! problem with ANY operator in basic sql query. dont know why it is required in my query and how will it work?sql子查询!基本 sql 查询中 ANY 运算符的问题。不知道为什么在我的查询中需要它以及它将如何工作? 【发布时间】:2020-04-12 18:14:55 【问题描述】:

我收到以下错误

标量子查询包含多于一行; SQL语句:select * from trip where price= (select price from hike_trip ); [90053-193]

从 SQL

SELECT *
FROM trip
WHERE price =  (
  SELECT price
  FROM hiking_trip
);

我知道如果在= 之后将ANY 添加到我的代码中,错误就会消失。但我不明白为什么它不起作用?它不应该给我等于给定条件的价格吗?为什么ANY 会成功?

更新:我明白了你告诉我的意思,但后来

选择 * 来自国家 存在于哪里 ( 选择 * 从山 在哪里 mountain.country_id=country.id );

在这个查询中,子查询中的 select *statement 不会返回超过一行或一列,但它在这里工作吗??

【问题讨论】:

'=' 运算符希望子查询返回一行。如果子查询返回多于 1 行,请使用“IN”运算符。 【参考方案1】:

这是因为子查询SELECT price FROM hiking_trip返回多行。

您需要使用IN 而不是= 才能工作。

SELECT * FROM trip WHERE price IN ( SELECT price FROM hiking_trip );

【讨论】:

【参考方案2】:

这是因为您的子查询返回不止一行。

您可以使用IN 代替=

SELECT * FROM trip WHERE price IN ( SELECT price FROM hiking_trip );

或者你可以使用LIMIT

SELECT * FROM trip WHERE price = (SELECT price FROM hiking_trip LIMIT 1)

这将使用第一行过滤子查询结果

【讨论】:

【参考方案3】:

这失败了,因为= 期望比较的单个值,而不是select 返回的值列表。从技术上讲,它需要一个标量子查询——一个返回 1 列和 0 或 1 行的子查询。

您可以通过多种方式解决语法问题。

使用聚合返回一个值:

WHERE trip.price = ( SELECT MAX(price) FROM hiking_trip )

使用limit返回一个值:

WHERE trip.price = (SELECT price FROM hiking_trip LIMIT 1)

使用in 匹配任意值:

WHERE trip.price IN (SELECT price FROM hiking_trip)

使用any

WHERE trip.price = ANY (SELECT price FROM hiking_trip)

【讨论】:

@丹尼尔。 . .谢谢。

以上是关于sql子查询!基本 sql 查询中 ANY 运算符的问题。不知道为啥在我的查询中需要它以及它将如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL数据库基础(子查询与链接)(持续更新中)

东软实习之数据库——子查询

HGDB中any用法

HGDB中any用法

Oracle Any/Some运算符

HGDB中any用法