【问题标题】:Why do left and right join ignore some values in a query?为什么左右连接会忽略查询中的某些值?
【发布时间】:2020-04-04 15:19:24
【问题描述】:

我有一个包含 3 列和这些值的表:

col1   col2   col3
-------------------
  1      2      8
  1      3      5
  1     10     15
  2      4      6
  2      9      7
  3      5      6

我加入一个查询 LEFT JOIN 和 RIGHT JOIN 一个分组和计数查询 每个号码(MS-ACCESS)。

SELECT Col1 AS Num, t1.CON1, t2.CON2, t3.CON3
        FROM
           (((SELECT col1, COUNT(col1) AS CON1 FROM table GROUP BY col1) AS t1
              LEFT JOIN (SELECT col2, COUNT(col2) AS CON2 FROM table GROUP BY col2) AS t2
                         ON t1.col1 = t2.col2)
              LEFT JOIN (SELECT col3, COUNT(col3) AS CON3 FROM table GROUP BY col3) AS t3
                         ON t2.col2 = t3.col3)
        UNION
        SELECT col3 AS Num, t1.CON1, t2.CON2, t3.CON3
        FROM
           (((SELECT col1, COUNT(col1) AS CON1 FROM table GROUP BY col1) AS t1
              RIGHT JOIN (SELECT col2, COUNT(col2) AS CON2 FROM table GROUP BY col2) AS t2
                          ON t1.col1 = t2.col2)
              RIGHT JOIN (SELECT col3, COUNT(col3) AS CON3 FROM table GROUP BY col3) AS t3
                          ON t2.col1 = t3.col3)

结果如下:

Num  CON1  CON2  CON3
--------------------------
  1    3      
  2    2     1
  3    1     1
  5          1     1
  6                2
  7                1
  8                1
 15                1

但此查询忽略了表第 2 列中的值计数

Num    CON2
--------------- 
   4       1
   9       1
  10       1

我的查询中缺少什么?

【问题讨论】:

  • 你想在这里实现什么?您的最终预期输出是什么?
  • CON2 列的值(4、9、10)的计数在最终结果中缺少积分..
  • 请通过编辑而非 cmets 进行澄清。请不要大喊大叫。请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出您可以给出的最少代码,即您显示的代码可以通过您显示的代码扩展为不正常。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。 How to Ask 说输出是输入的函数。不要希望我们猜测。

标签: sql ms-access left-join right-join


【解决方案1】:

如果要统计每个值和每列的次数,那么使用union all拆分数据,然后group by

select num, sum(col1), sum(col2), sum(col3)
from ((select col1 as num, 1 as col1, 0 as col2, 0 as col3
       from t
      ) union all
      (select col2 as num, 0 as col1, 1 as col2, 0 as col3
       from t
      ) union all
      (select col3 as num, 0 as col1, 0 as col2, 1 as col3
       from t
      )
     ) as x
group by num
order by num;

【讨论】:

    【解决方案2】:

    这给出了正确的总数,但我不知道如何总结结果(例如,它列出了 3 次)...

    (
            (SELECT col1 as num, COUNT(col1) AS CON1, null as CON2, null as CON3  FROM mytable t1
              LEFT JOIN (SELECT col2, COUNT(col2) AS CON2 FROM mytable GROUP BY col2)  t2
                         ON t1.col1 = t2.col2
              LEFT JOIN (SELECT col3, COUNT(col3) AS CON3 FROM mytable GROUP BY col3)  t3
                         ON t2.col2 = t3.col3
            GROUP BY t1.col1)
    
            UNION
    
           (SELECT col2 as num, null as CON1, COUNT(col2) AS CON2, null as CON3  FROM mytable t4
              left JOIN (SELECT col1, COUNT(col1) AS CON1 FROM mytable GROUP BY col1)  t5
                          ON t4.col2 = t5.col1
              left JOIN (SELECT col3, COUNT(col3) AS CON3 FROM mytable GROUP BY col3)  t6
                          ON t4.col2 = t6.col3
    
            GROUP BY t4.col2)
    
            UNION
    
             (SELECT col3 as num, null as CON1, null as CON2, COUNT(col3) AS CON3 FROM mytable t7
              left JOIN (SELECT col1, COUNT(col1) AS CON1 FROM mytable GROUP BY col1)  t8
                          ON t7.col3 = t8.col1
              left JOIN (SELECT col2, COUNT(col2) AS CON3 FROM mytable GROUP BY col2)  t9
                          ON t7.col3 = t9.col2
    
            GROUP BY t7.col3)
            )
    

    结果:

    num     CON1    CON2    CON3
    1        3      
    2                1  
    2        2      
    3                1  
    3        1  
    4                1
    5                        1
    5                1  
    6                        2
    7                        1
    8                        1
    9                1  
    10               1  
    15                       1
    

    ...有人吗?

    SQL 测试:https://sqltest.net/#979886

    【讨论】:

    • 网址仅供测试。代码在 Access 中不起作用吗?如果出现错误,在这些 cmets 中发布什么内容?
    猜你喜欢
    • 2019-09-12
    • 2016-04-25
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-27
    • 2022-01-09
    • 1970-01-01
    相关资源
    最近更新 更多