postgresql中的查询等价是什么

时间:2018-01-24 14:30:02

标签: mysql postgresql

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:

结果:期望结果等于图像

2 个答案:

答案 0 :(得分:1)

当查询正在进行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;

我认为通常你应该避免在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

相关问题