gpt4 book ai didi

mysql - postgresql 中的查询等价是什么

转载 作者:行者123 更新时间:2023-11-29 10:25:19 24 4
gpt4 key购买 nike

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 上查询:

结果:期望结果等于上图

最佳答案

ANY_VALUE MySQL 中的函数在查询执行 GROUP BY 时使用聚合,但正在选择 GROUP BY 中未提及的列子句也不会出现在聚合函数内部。在您的查询上下文中,这意味着唯一可以选择的列是 userID或聚合函数内的另一列,如 MAXSUM 。从技术上讲,您还可以从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;

我认为一般来说你应该避免使用ANY_VALUE在 MySQL 中,除非你别无选择。更好的长期解决方案是清理 MySQL 查询并使其符合 ANSI 标准。那么如何将其移植到另一个数据库就很简单了。

关于mysql - postgresql 中的查询等价是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48424875/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com