Sql 为什么我必须添加括号才能使工会工作

Sql 为什么我必须添加括号才能使工会工作,sql,postgresql,sql-order-by,union,Sql,Postgresql,Sql Order By,Union,表: 问题:编写以下SQL查询: 查找对电影数量评分最高的用户的名称。 如果是平局,则返回按字典顺序排列的较小用户名 查找2020年2月平均收视率最高的电影名称。 如果是平局,则返回按字典顺序排列的较小电影名称 查询分两行返回,以上表的查询结果格式为: create table movies ( movie_id int primary key, title varchar(50)); insert into movies values (1, 'avengers'), (2, 'frozen

表:

问题:编写以下SQL查询:

查找对电影数量评分最高的用户的名称。 如果是平局,则返回按字典顺序排列的较小用户名

查找2020年2月平均收视率最高的电影名称。 如果是平局,则返回按字典顺序排列的较小电影名称

查询分两行返回,以上表的查询结果格式为:

create table movies (
movie_id int primary key,
title varchar(50));

insert into movies values
(1, 'avengers'), (2, 'frozen2'), (3, 'joker');

create table users (
user_id int primary key,
name varchar(50));

insert into users values
(1, 'daniel'), (2, 'monica'), (3, 'maria'), (4, 'james');

create table movie_rating (
movie_id int,
user_id int,
rating int,
created_at date,
primary key (movie_id, user_id));

insert into movie_rating values
(1, 1, 3, '2020-01-12'),
(1, 2, 4, '2020-02-11'),
(1, 3, 2, '2020-02-12'),
(1, 4, 1, '2020-01-01'),
(2, 1, 5, '2020-02-17'),
(2, 2, 2, '2020-02-01'),
(2, 3, 2, '2020-03-01'),
(3, 1, 3, '2020-02-22'),
(3, 2, 3, '2020-02-25');
只有在联合前后加上括号,下面的解决方案才有效

如果我没有括号,我会出错。为什么我要用括号来让工会工作


如果没有额外的括号,LIMIT只允许在查询结束时使用一次,并应用于UNION的结果。要将限制附加到每个选项,需要使用括号

请核对:


select_语句是任何没有ORDER BY、LIMIT、FOR NO KEY UPDATE、FOR UPDATE、FOR SHARE或FOR KEY SHARE子句的select语句。如果子表达式用括号括起来,则可以将ORDER BY和LIMIT附加到该子表达式。如果没有括号,这些子句将被视为应用于联合的结果,而不是其右侧的输入表达式。

如果没有额外的括号,LIMIT只允许在查询结束时使用一次,并应用于联合的结果。要将限制附加到每个选项,需要使用括号

请核对:

select_语句是任何没有ORDER BY、LIMIT、FOR NO KEY UPDATE、FOR UPDATE、FOR SHARE或FOR KEY SHARE子句的select语句。如果子表达式用括号括起来,则可以将ORDER BY和LIMIT附加到该子表达式。如果没有括号,这些子句将应用于并集的结果,而不是其右侧的输入表达式。

若要对单个SELECT应用ORDER BY或LIMIT,请将子句放在包含SELECT的括号内

原因是最后一条[按r.movie_id分组,m.title order by avgr.rating desc,m.title limit 1;]可适用于最后一次选择或联合。括号解决了这种语法歧义。

若要对单个SELECT应用ORDER BY或LIMIT,请将子句放在包含SELECT的括号内


原因是最后一条[按r.movie_id分组,m.title order by avgr.rating desc,m.title limit 1;]可适用于最后一次选择或联合。括号解决了这种语法歧义。

虽然答案是正确的,但最好引用Postgres手册,因为问题是关于这一点,而不是关于MySQLYes,但手册没有明确解释必须使用括号的情况。任何歧义都应该通过使用括号来解决,以便在语法上强制执行所需的语义,从而导致不必要的副作用。复杂的SQL非常危险,不推荐使用,因为很难进行自动测试。星期天好!虽然答案是正确的,但最好引用Postgres手册,因为问题是关于这一点,而不是关于MySQLYes,但手册没有明确解释必须使用括号的情况。任何歧义都应该通过使用括号来解决,以便在语法上强制执行所需的语义,从而导致不必要的副作用。复杂的SQL非常危险,不推荐使用,因为很难进行自动测试。星期天好!
Result table:
+--------------+
| results      |
+--------------+
| daniel       |
| frozen 2     |
+--------------+
(select u.name results
from users u join movie_rating m on u.user_id = m.user_id
group by m.user_id, u.name
order by count(rating) desc, name
limit 1)
union
(select m.title results
from movies m join movie_rating r 
on m.movie_id = r.movie_id
and r.created_at between '2020-02-01' and '2020-02-29'
group by r.movie_id, m.title
order by avg(r.rating) desc, m.title
limit 1);
select u.name results
from users u join movie_rating m on u.user_id = m.user_id
group by m.user_id, u.name
order by count(rating) desc, name
limit 1
union
select m.title results
from movies m join movie_rating r 
on m.movie_id = r.movie_id
and r.created_at between '2020-02-01' and '2020-02-29'
group by r.movie_id, m.title
order by avg(r.rating) desc, m.title
limit 1;
ERROR:  syntax error at or near "union"
LINE 6: union
        ^