【问题标题】:Counting matching rows of two same tables and counting rows of the table计算两个相同表的匹配行并计算表的行数
【发布时间】:2019-09-25 04:30:08
【问题描述】:

我在两个不同的模式“schema1”和“schema2”下有相同的表结构,称为“table1”。 “table1”包含列“col1, col2, col3”。最初我想看看在表schema1.table1schema2.table1 中是否存在具有col1col2 相同条目的记录。但我把schema2.table1 打错了schema1.table1。现在我被查询结果弄糊涂了。

SELECT COUNT(*) FROM schema1.table1 AS s1t, schema1.table1 AS s2t
WHERE s1t.col1 = s2t.col1 AND s1t.col2 = s2t.col2;

我明白了

 count 
-------
   530
(1 row)

但是,SELECT COUNT(*) FROM schema1.table1; 显示有 17815 行。

为什么第一个查询显示只有 530 条满意的记录?不应该是17815吗?

【问题讨论】:

  • 今日提示:始终使用现代、明确的JOIN 语法。更容易编写(没有错误),更容易阅读(和维护),并且在需要时更容易转换为外连接。
  • 表中有空值吗?此类行将不计入此处。做select count(*) from schema1.table1 where col1 is null or col2 is null.
  • @jarlh 好的,返回的查询结果加上 530 确实加起来 17815...我不知道我不能在 sql 中执行类似 NULL = NULL 的操作。
  • 例如select count(*) from table1 where col1 = col1select count(*) from table1 where col1 is not null 相同

标签: sql postgresql


【解决方案1】:

您可以尝试使用FULL OUTER JOIN 查看甚至不匹配的行,包括列(col1 和 2)的空值。这样,至少(大于或等于)17815 行返回

SELECT COUNT(*)
  FROM schema1.table1 AS s1t
  FULL OUTER JOIN schema1.table1 AS s2t
    ON s1t.col1 = s2t.col1 AND s1t.col2 = s2t.col2

在您的情况下,这些列(col1 和 2)只返回匹配的行。

【讨论】:

    【解决方案2】:

    您正在将表连接到自身。真是奇怪。

    无论如何,您的join 将过滤掉col1col2NULL 的任何行。

    此外,如果表中有重复项(相对于两列),自联接可能会增加行数。

    目前还不清楚您为什么要这样做,但以上解释了您所看到的结果。

    如果你想比较两个模式中的结果允许重复和缺失值,我推荐union all/group by

    select col1, col2, sum(cnt1) as cnt1, sum(cnt2) as cnt2
    from ((select col1, col2, count(*) as cnt1, 0 as cnt2
           from schema1.table1
           group by col1, col2
          ) union all
          (select col1, col2, 0 as cnt1, count(*) as cnt2
           from schema2.table1
           group by col1, col2
          )
         ) t12
    group by col1, col2
    having sum(cnt1) <> sum(cnt2);
    

    这将返回两个表中计数不相同的对。它甚至适用于 NULL 值。如果您在同一张表上运行,则不会返回任何行。

    【讨论】:

    • 我将 schema2.table1 错误输入为 schema1.table1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    • 2020-07-05
    • 2019-09-14
    • 2019-11-30
    • 1970-01-01
    相关资源
    最近更新 更多