postgresql 如果没有交叉连接,你会如何重写这个查询?

ggazkfy8  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(2)|浏览(156)

我听说我应该避免交叉连接,所以我的问题是,如果没有交叉连接,你将如何重写这个查询?

SELECT p.*, po.*, pt.*
    FROM product p
    CROSS JOIN LATERAL (
        SELECT json_agg(name) AS product_options
        FROM product_options po
        WHERE po.p_id = p.id
    ) po
    CROSS JOIN LATERAL (
        SELECT json_agg(json_build_object('tag', tag)) AS tags
        FROM product_tags pt
        WHERE pt.p_id = p.id
    ) pt
    WHERE p.id = 1

字符串
这里有一个小提琴的例子
http://sqlfiddle.com/#!17/be10d/35
重要的是,我需要一个数组的产品选项和标签的对象,但你可以看到这对小提琴的例子,所以我需要确切的这一行与这些领域,但没有交叉加入

qybjjes1

qybjjes11#

下面是使用LEFT JOIN的查询的等价形式:

SELECT p.*, po.product_options, pt.tags
FROM product p
LEFT JOIN  (
    SELECT p_id, json_agg(name) AS product_options
    FROM product_options po
    GROUP BY p_id
) po ON po.p_id = p.id
LEFT JOIN  (
    SELECT p_id, json_agg(json_build_object('tag', tag)) AS tags
    FROM product_tags pt
    GROUP BY p_id
) pt ON pt.p_id = p.id
WHERE p.id = 1;

字符串
演示在这里

iswrvxsc

iswrvxsc2#

如果你正在和一个对joins过敏的人打交道,你根本不需要join:demo

SELECT p.*,(SELECT json_agg(name) AS product_options
            FROM product_options po
            WHERE po.p_id = p.id), 
           (SELECT json_agg(json_build_object('tag', tag)) AS tags
            FROM product_tags pt
            WHERE pt.p_id = p.id)
FROM product p
WHERE p.id = 1

字符串
两个相关的子查询都是标量的,这允许它们像这样向上移动。

相关问题