调试:PostgreSQL中的LATERAL查询

时间:2017-12-12 03:19:28

标签: postgresql debugging

SELECT
cu.user_id,
cu.gender,
CASE WHEN cu.looking_for_gender = cu.gender THEN 1 ELSE 0 END AS 
sexual_orientation,
os_name,
ROUND((DATE(NOW()) - cu.birthdate)/365.25) AS user_age,
SUM(dsb.likes) AS likes,
SUM(dsb.dislikes) AS dislikes,
SUM(dsb.blocks) AS blocks,
SUM(dsb.matches) AS matches,
SUM(dsb.received_likes) AS received_likes,
SUM(dsb.received_dislikes) AS received_dislikes,
SUM(dsb.received_blocks) AS received_blocks,
CASE WHEN cu.status = 'default' THEN 1 ELSE 0 END AS recall_case,
CASE WHEN cu.status = 'default' THEN extract(epoch from 
cu.last_activity - cu.updated_time)/86400 ELSE 0 END AS 
recall_retention
FROM ( SELECT stats.core_users cu
LEFT JOIN yay.daily_swipes_by_users dsb ON (dsb.user_id = cu.user_id)
WHERE cu.user_id = '1' GROUP BY 1) e1
LEFT JOIN LATERAL (SELECT cd.os_name FROM stats.core_devices cd WHERE 
e1.user_id = cd.user_id ORDER BY cd.updated_time DESC LIMIT 1) e2
ON TRUE;

当前错误代码: 错误:“LEFT”处或附近的语法错误 第18行:LEFT JOIN yay.daily_swipes_by_users dsb ON(dsb.user_id = cu ...          ^

2 个答案:

答案 0 :(得分:0)

提供的查询会在很多方面失败,我希望以下内容可能会有效,但正如您所看到的,这会在流程中删除大量其他列

SELECT
   e1.user_id
 , e1.cu
 , e2.os_name
FROM (
       SELECT stats.core_users cu, cu.user_id
       LEFT JOIN yay.daily_swipes_by_users dsb ON (dsb.user_id = cu.user_id)
       WHERE cu.user_id = '1'
       GROUP BY stats.core_users cu, cu.user_id
       ) e1
LEFT JOIN LATERAL(
      SELECT cd.os_name 
      FROM stats.core_devices cd 
      WHERE e1.user_id = cd.user_id 
      ORDER BY cd.updated_time DESC 
      LIMIT 1) e2 ON TRUE
;

答案 1 :(得分:0)

SELECT
  cu.user_id,
  cu.gender,
  CASE WHEN cu.looking_for_gender = cu.gender THEN 1 ELSE 0 END AS sexual_orientation,
  e2.os_name,
  ROUND((DATE(NOW()) - cu.birthdate)/365.25) AS user_age,
  CASE WHEN cu.status = 'default' THEN 1 ELSE 0 END AS recall_case,
  CASE WHEN cu.status = 'default' THEN extract(epoch from cu.last_activity - cu.updated_time)/86400 ELSE 0 END AS recall_retention,
  SUM(dsb.likes) AS likes,
  SUM(dsb.dislikes) AS dislikes,
  SUM(dsb.blocks) AS blocks,
  SUM(dsb.matches) AS matches,
  SUM(dsb.received_likes) AS received_likes,
  SUM(dsb.received_dislikes) AS received_dislikes,
  SUM(dsb.received_blocks) AS received_blocks
FROM
  stats.core_users cu
LEFT JOIN yay.daily_swipes_by_users dsb ON (dsb.user_id = cu.user_id)
LEFT JOIN LATERAL (SELECT cd.os_name FROM stats.core_devices cd WHERE cu.user_id = cd.user_id ORDER BY cd.updated_time DESC LIMIT 1) e2
ON TRUE
WHERE cu.user_id = '1'
GROUP BY 1,2,3,4,5,6,7
;

这很有效。