繁体   English   中英

将联合查询重写为单个查询

[英]Rewrite union query to a single query

我想知道是否可以将其写为一个查询:

SELECT * FROM
(SELECT  "markets".* 
  FROM "markets" 
  INNER JOIN "positions" ON "positions"."id" = "markets"."position_id" 
  INNER JOIN "players" ON "players"."id" = "positions"."player_id" 
  INNER JOIN "other_players" ON "other_players"."id" = "players"."other_player_id" 
  WHERE (markets.updated_at > '2021-01-10 11:50:14.136015') 
  AND "markets"."on_feed" = true
  AND "markets"."deleted_at" IS NULL

  UNION

  SELECT  "markets".* 
  FROM "markets" 
  WHERE (markets.updated_at > '2021-01-10 11:50:14.136015') 
  AND "markets"."on_feed" = true 
  AND "markets"."deleted_at" IS NOT NULL) results
ORDER BY results.updated_at DESC

这两个查询有很多重叠之处。 在第一个中,我们希望所有市场都有这些关联。 对于第二个查询,我们并不关心关联是否存在。

  SELECT * FROM "markets" 
  LEFT JOIN "positions" ON "positions"."id" = "markets"."position_id" 
  LEFT JOIN "players" ON "players"."id" = "positions"."player_id" 
  LEFT JOIN "other_players" ON "other_players"."id" = "players"."other_player_id" 
  WHERE markets.updated_at > '2021-01-10 11:50:14.136015'
  AND "markets"."on_feed" = true
  AND ("markets"."deleted_at" IS NOT NULL 
  OR "positions"."id" IS NOT NULL AND "players"."id" IS NOT NULL 
      AND "other_players"."id" IS NOT NULL)
  ORDER BY markets.updated_at DESC

改用EXISTS

SELECT m.* 
FROM "markets"  m
WHERE m.updated_at > '2021-01-10 11:50:14.136015' AND
      markets."on_feed" = true AND
      (m."deleted_at" IS NOT NULL OR
       EXISTS (SELECT 1
               FROM "positions" p JOIN 
                    "players" pl
                    ON pl."id" = p."player_id" JOIN
                    "other_players" op
                    ON op."id" = p."other_player_id" 
               WHERE p."id" = m."position_id" 
              )
      )
ORDER BY m.updated_at DESC

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM