在桌子上做左连接

时间:2020-06-16 12:29:36

标签: sql postgresql

我有两个表,第一个表(table1)包含id,dat_beg,句点,dat_end。第二个表(表2)包含多个列,包括 cod_client和cod_contract 。我想对提到的表执行左连接。 请问有人知道我的代码有什么问题吗?

先谢谢您,

select id, DATE_TRUNC('day', table1.dat_beg) as date, s1, cod_client, sum(perid) as sum_period from (
select id, table1.dat_end, x, table1.dat_beg , 
(case when TRIM(x) like 'cat/%' then 'cat'
when TRIM(x) like 'fol/%' then 'follower'
else 'unknown'
end) as s1,
(extract(epoch from (table1.dat_end - table1.dat_beg)))/60 as sum_period
from table1 left join table2 on table1.id = table2.cod_contract
where table1.dat_end < '2262-04-11' and table1.dat_beg >= '2019-01-10'
) X
group by table1.id, table1.s1, table1.date

2 个答案:

答案 0 :(得分:1)

此查询实际上存在很多问题。我将发布我认为可能有用的内容,然后发布我不确定的内容。

SELECT 
    x.id, 
    DATE_TRUNC('day', x.dat_beg) AS date_day, 
    x.s1, 
    x.cod_client, 
    SUM(x.sum_period) AS sum_period 
FROM 
    (
        SELECT 
            id, 
            table1.dat_beg, 
            table2.cod_client,
            CASE 
                WHEN TRIM(x) LIKE 'cat/%' THEN 'cat'
                WHEN TRIM(x) LIKE 'fol/%' THEN 'follower'
                ELSE 'unknown'
            END AS s1,
            (EXTRACT(epoch FROM (table1.dat_end - table1.dat_beg)))/60 AS sum_period
        FROM 
            table1 
            LEFT JOIN table2 ON table1.id = table2.cod_contract
        WHERE 
            table1.dat_end < '2262-04-11' 
            AND table1.dat_beg >= '2019-01-10'
    ) x
GROUP BY 
    x.id, 
    DATE_TRUNC('day', x.dat_beg), 
    x.s1, 
    x.cod_client

问题:

  • cod_client未包含在子查询中,所以我猜它来自table2
  • 您在子查询之外引用了table1,那里没有任何意义。我改为x
  • 您有很多额外的(不必要的(真的!))括号;
  • 您的x子查询中有没有在外部查询中使用的列;
  • 您正在汇总一个叫做perid的东西,但是那并不存在,我想它应该是sum_period

编辑

Demo on Fiddle

答案 1 :(得分:0)

您的查询似乎正确,除了GROUP BY子句和SUM函数-

SELECT id, 
       Date_trunc('day', table1.dat_beg) AS date, 
       s1, 
       cod_client, 
       Sum(sum_period)                        AS perid 
FROM   (SELECT id, 
               table1.dat_end, 
               x, 
               table1.dat_beg, 
               ( CASE 
                   WHEN Trim(x) LIKE 'cat/%' THEN 'cat' 
                   WHEN Trim(x) LIKE 'fol/%' THEN 'follower' 
                   ELSE 'unknown' 
                 END ) 
               AS s1, 
               ( Extract(epoch FROM ( table1.dat_end - table1.dat_beg )) ) / 60 
               AS 
                      sum_period 
        FROM   table1 
               LEFT JOIN table2 
                      ON table1.id = table2.cod_contract 
        WHERE  table1.dat_end < '2262-04-11' 
               AND table1.dat_beg >= '2019-01-10') X 
GROUP  BY id, 
       Date_trunc('day', table1.dat_beg), 
       s1, 
       cod_client
相关问题