簡體   English   中英

為什么左右連接會忽略查詢中的某些值?

[英]Why do left and right join ignore some values in a query?

我有一個包含 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

我的查詢中缺少什么?

如果要計算每列中的每個值和次數,請使用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;

這給出了正確的總數,但我不知道如何總結結果(例如,它列出了 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM