首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将内连接查询与不同值的计数组合在一起

将内连接查询与不同值的计数组合在一起
EN

Stack Overflow用户
提问于 2014-05-06 06:53:09
回答 2查看 273关注 0票数 0

我正在尝试链接两个具有相似列的表。我需要找出与table1.column 1和table 2.column 1不同的值有多少:

我现在的问题是:

代码语言:javascript
运行
复制
SELECT i10_descr.i10_code, gems_pcsi9.i10_code
FROM i10_descr INNER JOIN gems_pcsi9 ON i10_descr.i10_code = gems_pcsi9.i10_code
ORDER BY i10_descr.i10_code;

我知道这个查询显示了每个表的匹配代码:我不知道如何计算表中缺少的/不同的代码。

此外,我还必须计算代码的比率。

任何帮助、提示或指导都是非常感谢的。

谢谢

EN

回答 2

Stack Overflow用户

发布于 2014-05-06 07:18:43

您可以使用反联接模式来获取存在于一个表中但不存在于另一个表中的i10_code的列表。例如:

代码语言:javascript
运行
复制
SELECT i.i10_code
  FROM i10_descr i
  LEFT
  JOIN gems_pcsi9 g
    ON g.i10_code = i.i10_code
 WHERE g.i10_code IS NULL
 ORDER BY i.i10_code

如果只想要计数,可以在选择列表中使用COUNT(i.i10_code)和/或COUNT(DISINCT i.i10_code),并删除ORDER BY子句。

要在gems表中获取不在i10表中的i10_code,可以执行相同的操作,但将查询颠倒一下,这样gems就是“驱动”表。例如:

代码语言:javascript
运行
复制
SELECT COUNT(DISTINCT g.i10_code) AS cnt_diff
  FROM gems_pcsi9 g
  LEFT
  JOIN i10_descr i
    ON i.i10_code = g.i10_code
 WHERE i.i10_code IS NULL

如果想要组合差异的数量,可以通过使两个查询成为内联视图来组合它们:

代码语言:javascript
运行
复制
SELECT d.cnt_diff + e.cnt_diff AS total_diff 
  FROM (
         SELECT COUNT(DISTINCT g.i10_code) AS cnt_diff
           FROM gems_pcsi9 g
            LEFT
            JOIN i10_descr i
              ON i.i10_code = g.i10_code
           WHERE i.i10_code IS NULL
       ) d
 CROSS 
  JOIN ( 
         SELECT COUNT(DISTINCT i.i10_code) AS cnt_diff
           FROM i10_descr i
           LEFT
           JOIN gems_pcsi9 g
             ON g.i10_code = i.i10_code
          WHERE g.i10_code IS NULL
       ) e

注意: COUNT aggregate将忽略空值。如果您还想“计算”i10_code为NULL值的行,则需要调整查询。如果您只想要一些不同的值,则可以使用COUNT(DISTINCT )。一个COUNT()会给出很多行。如果有多个行具有相同的i10_code值,则这两个结果将不同。

为了获得代码的“比率”,假设在这一点上,“差异”无关紧要,您可以从每个表中获得代码的计数。这样做的查询可以在内联视图中使用:

代码语言:javascript
运行
复制
SELECT d.cnt / e.cnt AS ratio_cnt_g_over_cnt_i
     , d.cnt         AS cnt_g
     , e.cnt         AS cnt_i
  FROM (
         SELECT COUNT(DISTINCT g.i10_code) AS cnt
           FROM gems_pcsi9 g
       ) d
 CROSS 
  JOIN ( 
         SELECT COUNT(DISTINCT i.i10_code) AS cnt
           FROM i10_descr i
       ) e
票数 1
EN

Stack Overflow用户

发布于 2014-05-06 07:03:38

另一种方法是将union all与聚合一起使用:

代码语言:javascript
运行
复制
select in_i10descr, in_gems_pcsi9, count(*) as numcodes
from (select code, max(in_i10descr) as in_i10descr, max(in_gems_pcsi9) as in_gems_pcsi9
      from ((select i10_descr.i10_code as code, 1 as in_i10descr, 0 as in_gems_pcsi9
             from i10_descr
            ) union all
            (select gems_pcsi9.i10_code, 0, 1
             gems_pcsi9.i10_code
            )
           ) t
      group by code
     ) c
group by in_i10descr, in_gems_pcsi9;

这将分别计算每个表和两个表中的计数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23483249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档