Postgresql pgSQL:两列上的完全外部联接忽略了行

Postgresql pgSQL:两列上的完全外部联接忽略了行,postgresql,group-by,full-outer-join,Postgresql,Group By,Full Outer Join,在某些背景下,我在pgSQL9.5中制作了一个表,统计用户执行的操作数量,并使用date_trunc()按月对这些操作进行分组。每个单独操作的计数按以下格式分为单独的表格: Feedback_Table: Comments_Table: id | month | feedback_counted id | month | comments_counted ----+---------+--------

在某些背景下,我在pgSQL9.5中制作了一个表,统计用户执行的操作数量,并使用date_trunc()按月对这些操作进行分组。每个单独操作的计数按以下格式分为单独的表格:

Feedback_Table:                              Comments_Table:
id  |  month  |  feedback_counted            id  |  month  |  comments_counted
----+---------+-------------------           ----+---------+-------------------
 1  |    2    |         3                     1  |    4    |         12
 1  |    3    |        10                     1  |    5    |          4
 1  |    4    |         7                     1  |    6    |         57
 1  |    5    |         2                     1  |    7    |         12
理想情况下,我希望同时对“id”和“month”列上的这些表进行完整的外部联接,并生成以下查询:

Combined_Table:
id  |  month  |  feedback_counted  |  comments_counted
----+---------+--------------------+-------------------
 1  |    2    |         3          |         
 1  |    3    |        10          |        
 1  |    4    |         7          |        12
 1  |    5    |         2          |         4
 1  |    6    |                    |        57
 1  |    7    |                    |        12
但是,我当前的查询没有捕获反馈日期,显示方式如下:

Rollup_Table:
id  |  month  |  feedback_counted  |  comments_counted
----+---------+--------------------+-------------------    
    |         |                    |       
    |         |                    |       
 1  |    4    |         7          |        12
 1  |    5    |         2          |         4
 1  |    6    |                    |        57
 1  |    7    |                    |        12
这是我目前的声明,请注意,它使用日期代替月份。我在后面添加动作计数,主要问题在这里的某个地方

CREATE TABLE rollup_table AS 
SELECT c.id, c.date_trunc
    FROM comments_counted c FULL OUTER JOIN feedback_counted f 
    ON c.id = f.id AND c.date_trunc = f.date_trunc
GROUP BY c.id, c.date_trunc, f.id, f.date_trunc;

我对SQL有点生疏,不知道如何解决这个问题,如果有任何帮助,我将不胜感激。

而不是c.id=f.id和c.month=f.month上的

SELECT c.id, c.month, feedback_counted, comments_counted
FROM comments c 
FULL OUTER JOIN feedback f 
ON c.id = f.id AND c.month = f.month;

 id | month | feedback_counted | comments_counted 
----+-------+------------------+------------------
    |       |                3 |                 
    |       |               10 |                 
  1 |     4 |                7 |               12
  1 |     5 |                2 |                4
  1 |     6 |                  |               57
  1 |     7 |                  |               12
(6 rows)    
SELECT id, month, feedback_counted, comments_counted
FROM comments c 
FULL OUTER JOIN feedback f 
USING(id, month);

 id | month | feedback_counted | comments_counted 
----+-------+------------------+------------------
  1 |     2 |                3 |                 
  1 |     3 |               10 |                 
  1 |     4 |                7 |               12
  1 |     5 |                2 |                4
  1 |     6 |                  |               57
  1 |     7 |                  |               12
(6 rows)
使用
使用(id,月份)

USING()
基本上与
上的
相同,只是如果两个表共享相同的列名,您可以使用
USING()
而不是
上的
,以节省一些键入工作。也就是说,使用
using()
是行不通的。在Postgresql中(不确定其他sql版本),您仍然需要指定c.id和c.month,即使使用
USING()
。只要指定列,Postgresql将只提取这些列的值所在的行。这就是为什么在完全外部联接下缺少行的原因

这是一种至少对我有效的方法

SELECT COALESCE(c.id, f.id) AS id, 
       COALESCE(c.month, f.month) AS month, 
       feedback_counted, 
       comments_counted
FROM comments c 
FULL OUTER JOIN feedback f 
ON c.id = f.id AND c.month = f.month;

请在代码问题中给出一个--cut&paste&runnable代码,包括作为代码输入的最小代表性示例;期望和实际输出(包括逐字记录错误消息);标签和版本;清晰的说明和解释。尽可能少地给出代码,即显示为OK的代码,并通过显示为not OK的代码进行扩展。(调试基础。)用于包含DBMS和DDL(包括约束和索引)的SQL,并将其作为格式化为表的代码输入。在总体目标上暂停工作,在第一个表达中删去代码,不要给出你期望的,说出你期望的,为什么。