使用右表上的“按总和分组”对多列执行SQL联接

使用右表上的“按总和分组”对多列执行SQL联接,sql,join,Sql,Join,我有两个表表A和表B,我想在多个列上连接它们。 但是连接的第三个标准是表B中的值的总和 表A: 表B: 因此,目的是加入 A.col1 = B.Col1 AND A.Col2 = B.Col2 AND A.Col3 = sum(B.Col3) GROUP BY B.Col1, B.Col2 为了方便起见,最终目的是排除表A和表B之间的匹配。因此,最终结果将是表A中的记录,其中表B中的总和不匹配,并显示两个表中的值。换句话说,设置一个连接集B,排除公共集 表格

我有两个表表A和表B,我想在多个列上连接它们。 但是连接的第三个标准是表B中的值的总和

表A:

表B:

因此,目的是加入

    A.col1 = B.Col1 
    AND A.Col2 = B.Col2 
    AND A.Col3 = sum(B.Col3)
GROUP BY 
   B.Col1, B.Col2
为了方便起见,最终目的是排除表A和表B之间的匹配。因此,最终结果将是表A中的记录,其中表B中的总和不匹配,并显示两个表中的值。换句话说,设置一个连接集B,排除公共集

表格结果:

我尝试了多个完整的外部联接,只使用空键,但从未获得正确的结果。我通常只从表中得到X1-Y2值,而不是X1-Y3

谢谢


Nikbe

试试这个没有经过真正测试的方法,也许有一个更简单的解决方案:

SELECT NVL(a.col1, b.col1),
       NVL(a.col2, b.col2),
       MAX(a.col3) AS a_col3,
       MAX(b.col3) AS b_col3
  FROM ta a
  FULL
 OUTER 
  JOIN(SELECT col1,
              col2,
              SUM(col3) AS col3
         FROM tb
        GROUP
           BY col1,
              col2
      ) b
    ON a.col1 = b.col1
   AND a.col2 = b.col2
   AND a.col3 = b.col3
 WHERE b.col3 IS NULL OR a.col3 IS NULL 
 GROUP
    BY NVL(a.col1, b.col1),
       NVL(a.col2, b.col2)
试试这个:

SELECT A.*, B.col3_sum
 FROM A
 LEFT JOIN (
  SELECT Col1, Col2, SUM(Col3) col3_sum
   FROM B
   GROUP BY Col1, Col2
 ) B ON A.Col1 = B.Col1 
    AND A.Col2 = B.Col2 
 WHERE B.col3_sum IS NULL
    OR B.col3_sum <> A.Col3

测试它:

谢谢@Rimas和@DirkNM,两种解决方案都返回了正确的结果

Rimas的解决方案在执行时更快,更易于阅读

COL1 COL2           COL3   COL3_SUM
---- -------- ---------- ----------
X1   20140202          7          6 
X1   20140303          9            


NVL(A.COL1,B.COL1) NVL(A.COL2,B.COL2)     A_COL3     B_COL3
------------------ ------------------ ---------- ----------
X1                 20140303                    9            
X1                 20140202                    7          6 
SELECT NVL(a.col1, b.col1),
       NVL(a.col2, b.col2),
       MAX(a.col3) AS a_col3,
       MAX(b.col3) AS b_col3
  FROM ta a
  FULL
 OUTER 
  JOIN(SELECT col1,
              col2,
              SUM(col3) AS col3
         FROM tb
        GROUP
           BY col1,
              col2
      ) b
    ON a.col1 = b.col1
   AND a.col2 = b.col2
   AND a.col3 = b.col3
 WHERE b.col3 IS NULL OR a.col3 IS NULL 
 GROUP
    BY NVL(a.col1, b.col1),
       NVL(a.col2, b.col2)
SELECT A.*, B.col3_sum
 FROM A
 LEFT JOIN (
  SELECT Col1, Col2, SUM(Col3) col3_sum
   FROM B
   GROUP BY Col1, Col2
 ) B ON A.Col1 = B.Col1 
    AND A.Col2 = B.Col2 
 WHERE B.col3_sum IS NULL
    OR B.col3_sum <> A.Col3
COL1 COL2           COL3   COL3_SUM
---- -------- ---------- ----------
X1   20140202          7          6 
X1   20140303          9            


NVL(A.COL1,B.COL1) NVL(A.COL2,B.COL2)     A_COL3     B_COL3
------------------ ------------------ ---------- ----------
X1                 20140303                    9            
X1                 20140202                    7          6