需要帮助理解具有多个连接条件的复杂查询

时间:2013-06-17 15:16:26

标签: sql postgresql left-join

我有一个我想要了解的查询。有人可以了解这个查询的详细信息吗? 我只在连接条件中使用过一个ON子句。这个有LEFT JOIN的多个条件,这使得理解起来很棘手。

INSERT INTO nop_tbl
          (q_date, community_id, newsletter_t, subscription_count)     
  SELECT date(now()), a.community_id, 
     a.newsletter_type, 
     count(a.subscriber_user_id)
   FROM
      newsletter_subscribers_main a
   LEFT OUTER JOIN nop_tbl b
       ON (a.community_id = b.community_id)
       AND (a.newsletter_type = b.newsletter_t)
       AND (a.created_at = b.q_date)
   WHERE b.q_date is null
   AND   b.mailing_list is null
GROUP BY a.community_id, a.newsletter_t, a.created_at

3 个答案:

答案 0 :(得分:2)

你有解释:

查询的目标是计算(q_date, community_id, newsletter_t)newsletter_subscribers_main的订阅次数,并将结果写入nop_tbl
LEFT JOIN可以防止多次添加行。

但我也认为,查询效率低,可能错误

  • 第二个WHERE条款:

    AND   b.mailing_list is null
    

    只是噪音,可以删除。如果b.q_date is null,则此查询中的b.mailing_list保证为空。

  • JOIN条件周围不需要括号。

  • 如果定义subscriber_user_id NOT NULL,则count(*)会做同样的事情,更便宜。

  • 我怀疑在插入a.created_at时按date(now())进行分组可能是错误的。几乎没有任何意义。我的有根据的猜测(假设created_at的类型为date):

INSERT INTO nop_tbl
      (q_date, community_id, newsletter_t, subscription_count)     
SELECT a.created_at
      ,a.community_id
      ,a.newsletter_type
      ,count(*)
FROM   newsletter_subscribers_main a
LEFT   JOIN nop_tbl b ON a.community_id = b.community_id
                     AND a.newsletter_type = b.newsletter_t
                     AND a.created_at = b.q_date
WHERE  b.q_date IS NULL
GROUP  BY a.created_at, a.community_id, a.newsletter_t;

答案 1 :(得分:1)

简短版本是:

  1. insert ... select ...
    - >查询正在填写nob_tbl
  2. from ...
    - >基于newsletter_subscribers_main
  3. 中的数据
  4. left join ... where ... is null
    - > nob_tbl
  5. 中尚未出现的内容

答案 2 :(得分:0)

一步一步

INSERT INTO nop_tbl
      (q_date, community_id, newsletter_t, subscription_count) 

INSERT syntax这告诉数据库在哪个表和哪个列将用于插入查询

SELECT date(now()), a.community_id, 
       a.newsletter_type, 
       count(a.subscriber_user_id)

而是要插入的selected字段

FROM
newsletter_subscribers_main a

这里告诉数据库从表a.中选择前缀为newsletter_subscribers_main的字段

LEFT OUTER JOIN nop_tbl b

此处左侧是另一个表nop_tbl,其中将选择其他字段

ON (a.community_id = b.community_id)
AND (a.newsletter_type = b.newsletter_t)
AND (a.created_at = b.q_date)

这些是JOIN的规则,实际上是告诉哪些列将用于连接

WHERE b.q_date is null
AND   b.mailing_list is null

那些是WHERE clauses,它们用于将结果限制为所请求的数据,在这种情况下,两列为空

GROUP BY a.community_id, a.newsletter_t, a.created_at

GROUP BY clauses,用于对给定列的结果进行分组

您可以对joins here

进行直观说明