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

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

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

  1. SELECT p.*, po.*, pt.*
  2. FROM product p
  3. CROSS JOIN LATERAL (
  4. SELECT json_agg(name) AS product_options
  5. FROM product_options po
  6. WHERE po.p_id = p.id
  7. ) po
  8. CROSS JOIN LATERAL (
  9. SELECT json_agg(json_build_object('tag', tag)) AS tags
  10. FROM product_tags pt
  11. WHERE pt.p_id = p.id
  12. ) pt
  13. WHERE p.id = 1

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

qybjjes1

qybjjes11#

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

  1. SELECT p.*, po.product_options, pt.tags
  2. FROM product p
  3. LEFT JOIN (
  4. SELECT p_id, json_agg(name) AS product_options
  5. FROM product_options po
  6. GROUP BY p_id
  7. ) po ON po.p_id = p.id
  8. LEFT JOIN (
  9. SELECT p_id, json_agg(json_build_object('tag', tag)) AS tags
  10. FROM product_tags pt
  11. GROUP BY p_id
  12. ) pt ON pt.p_id = p.id
  13. WHERE p.id = 1;

字符串
演示在这里

展开查看全部
iswrvxsc

iswrvxsc2#

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

  1. SELECT p.*,(SELECT json_agg(name) AS product_options
  2. FROM product_options po
  3. WHERE po.p_id = p.id),
  4. (SELECT json_agg(json_build_object('tag', tag)) AS tags
  5. FROM product_tags pt
  6. WHERE pt.p_id = p.id)
  7. FROM product p
  8. WHERE p.id = 1

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

相关问题