postgresql上的等价查询是什么?
构建数据库和表
CREATE DATABASE IF NOT EXISTS lemonade;
use lemonade;
CREATE TABLE users (
id int PRIMARY KEY NOT NULL auto_increment,
name varchar(50) NOT NULL,
email varchar(50) NOT NULL
);
CREATE TABLE memories (
id int PRIMARY KEY NOT NULL auto_increment,
content varchar(50) NOT NULL,
userID int,
FOREIGN KEY (userID) REFERENCES users(id)
);
INSERT INTO users (name, email) VALUES ("Ruan", "ruan@gmail.com");
INSERT INTO users (name, email) VALUES ("Pereira", "pereira@gmail.com");
INSERT INTO memories (content, userID) VALUES ("memoria 1", 1);
INSERT INTO memories (content, userID) VALUES ("memoria 2", 1);
INSERT INTO memories (content, userID) VALUES ("memoria 3", 2);
INSERT INTO memories (content, userID) VALUES ("memoria 4", 2);
查询mysql:
select ANY_VALUE(m.id), ANY_VALUE(m.content), m.userID, ANY_VALUE(u.id), ANY_VALUE(u.name), ANY_VALUE(u.email) from memories m inner join users u on m.userID = u.id group by userID;
结果: image with result of my query
查询postgresql:
结果:期望结果等于图像
答案 0 :(得分:1)
当查询正在进行ANY_VALUE
聚合时,将使用MySQL中的GROUP BY
函数,但正在选择未在GROUP BY
子句中提及但也未出现在聚合函数内的列。在查询的上下文中,这意味着可以选择的唯一列是userID
或聚合函数内的另一列,如MAX
或SUM
。从技术上讲,您也可以从users
表中选择其他列,假设它们在功能上依赖于userId
。顾名思义,ANY_VALUE
告诉MySQL从每组记录中返回该列的任何值。
据我所知/期望,您从ANY_VALUE
获得的值不能保证是确定性的,因此在逻辑上等同于从每组记录中为该列选择随机值。假设你不关心你得到哪些值,在Postgres你可以任意选择每个用户最早的内存:
SELECT
memory_id, content, id, name, email
FROM
(
SELECT m.id AS memory_id, m.content, u.id, u.name, u.email,
ROW_NUMBER() OVER (PARTITION BY u.id ORDER BY m.id) rn
FROM memories m
INNER JOIN users u
ON m.userID = u.id
) t
WHERE rn = 1;
我认为通常你应该避免在MySQL中使用ANY_VALUE
,除非你绝对别无选择。一个更好的长期解决方案是清理MySQL查询并使其符合ANSI标准。然后,如何将它移植到另一个数据库将是直截了当的。
答案 1 :(得分:0)
我认为您需要DISTINCT ON ( expression ...)
子句。
新代码是
select distinct on(u.id)
m.id, m.content, m.userID, u.id, u.name, u.email
from memories m
inner join users u on m.userID = u.id;
注意:DISTINCT ON
是非标准SQL子句。
形成更多信息see