0

我想知道在大于运算符的情况下防止此错误的最佳解决方案是什么:正如这个问题中提到的,子查询返回了超过 1 个值。这在子查询时是不允许的 ,在这种情况下的解决方案=是将等于运算符替换为In,问题将得到解决。但是当我有>更大的运营商的情况下呢?

在这种情况下我能做什么?

什么可以代替>运营商来解决这个问题?

select userId 
from Users,table o where
Users.isActive=1 and o.UserId = Users.UserId
group by UserId 
having o.HourStart > (select Hour 
                      from Hours h, table b where b.HoursId = Hours.HoursId
                      group by Hour)
4

1 回答 1

0

有一个基于集合的ALLandANY运算符,它将一个值与一个集合的所有值进行比较。

笔记:

  • 使用正确的连接语法,而不是逗号,后者在近 30 年前已被弃用
  • 您必须将过滤器放在wherenot a中having,因为它不是聚合的一部分(这种方式通常也更有效)
  • group by在 -type 子查询中是不必要的,除非它在子exists查询中也带有having
select u.userId 
from Users u
join table o on o.UserId = u.UserId
where u.isActive=1
  and o.HourStart > ALL (
                      select Hour 
                      from Hours h
                      join table b on b.HoursId = h.HoursId)
group by u.UserId 

但大多数人觉得它非常混乱。

通常将它们表示为EXISTSor更容易NOT EXISTS,这意味着您需要将其翻转><=

select u.userId 
from Users u
join table o on o.UserId = u.UserId
where Users.isActive=1
  and not exists (select 1
                      from Hours h
                      join table b on b.HoursId = h.HoursId
                      where h.Hour <= o.HourStart)
group by u.UserId 

请参阅布拉德舒尔茨的更多信息

于 2021-04-22T11:56:38.207 回答