SQL聚合和加入后。显示不等于值和 NULL

SQL After aggregation and join. Display the Not Equal value and The NULLs

更新:

我正在努力做到这一点,

TBL1
PK     AK     TOT1
1      1      100  
2      2      200
3      3      300

TBL2
PK     AK     TOT2
1      1      50
2      1      50
3      2      150

首先,我汇总了 TBL2,即所有 TBL2.AK(1) 的总和。
然后用JOIN显示出来。

脚本是这样的,

SELECT t1.AK, t1.TOT1, t2.TOT1
FROM TBL1 t1
    JOIN (SELECT AK, SUM(TOT1) as TOT1
    FROM TBL2
    GROUP BY AK) t2
ON t1.AK = t2.AK
WHERE t1.TOT1 <> t2.TOT1

它显示 t1.TOT1 <> t2.TOT1 的表格。

但是到目前为止,我的问题是,


TBL1.AK 的值为 (3) 但 TBL2.AK 没有。 我还需要展示它们。

截至目前,我正在添加

LEFT JOIN  

并添加

WHERE t1.AK IS NULL OR t2.AK IS NULL.  

仍然没有成功。

WHERE t1.AK IS NULL OR t2.AK IS NULL OR t1.TOT1 <> t2.TOT1

查询正在执行内连接;它 return 只有具有匹配值的行。

你是对的,要从一个 table 中获取 在另一个 table 中有匹配行的行,你需要一个"outer"加入。

要获得您描述的结果:

1) 在JOIN关键字前添加关键字FULL,并且

2) 将WHERE子句中的谓词重定位到ON子句

2) WHERE 子句中的谓词还需要允许对 t1.TOT1 或 t2.TOT1 具有 NULL 值的行进行 returned


WHERE 子句中,条件 t1.TOT1 <> t2.TOT1 将否定连接的 "outerness"。对于从 t1 编辑的任何行 return 没有来自 t2 的匹配行,表达式 t2.TOT 将计算为 NULL,不等式比较将计算为 NULL .这将阻止该行被 returned.

JOIN 关键字是一个 "inner" 连接。要获得外部联接,必须在其前面加上关键字 LEFTRIGHTFULL。要允许 "non-matching" 行被 returned,WHERE 子句不得禁止这些行被 returned。


例如

SELECT t1.AK
     , t1.TOT1
     , t2.TOT1
  FROM TBL1 t1
  FULL
  JOIN ( SELECT AK
             , SUM(TOT1) AS TOT1
          FROM TBL2
         GROUP BY AK
       ) t2
    ON t1.AK = t2.AK
 WHERE t1.TOT1 <> t2.TOT1
    OR (t1.TOT1 IS     NULL AND t2.TOT1 IS NOT NULL)
    OR (t1.TOT1 IS NOT NULL AND t2.TOT1 IS     NULL)

在这种形式下,查询将 return 行

AK     t1.TOT1  t2.TOT1    
3      300      NULL
NULL   NULL     400

如果您想 return 值“4”作为最后一行 AK 列的值,您需要在 SELECT 列表中使用不同的表达式,例如

SELECT NVL(t1.AK,t2,AK) AS AK

或更多等效的 ANSI 标准

SELECT CASE WHEN t1.AK IS NOT NULL t1.AK ELSE t2.AK END AS AK

我不确定你想显示什么,因为你只在 table 中汇总数据,但我建议这样。

用于查询table中的所有记录。就这样。

SELECT *  -- Display as you want
FROM TBL1 t1
FULL OUTER JOIN TBL2 t2
ON t1.AK = t2.AK

如果需要将table中AK的数据合并为一列。你可以使用 NVL

SELECT NVL(t1.AK,t2.AK)   --if t1.AK value is null, it will display t2.AK value.
FROM TBL1 t1
FULL OUTER JOIN TBL2 t2
ON t1.AK = t2.AK

如果你需要"group by"和求和值,你可以这样做。

SELECT NVL(t1.AK,t2.AK),  
       SUM(t1.TOT1),
       SUM(t2.TOT2)
FROM TBL1 t1
FULL OUTER JOIN TBL2 t2
ON t1.AK = t2.AK 
GROUP BY NVL(t1.AK,t2.AK)

已编辑:也许您在下面需要这个。

SELECT NVL(t1.AK,t2.AK),  
       t1.TOT1,
       t2.TOT1
FROM TBL1 t1
FULL OUTER JOIN (SELECT AK, SUM(TOT2) AS TOT1
                 FROM TBL1 2
                 GROUP BY AK) t2
ON t1.AK = t2.AK 
WHERE t1.TOT1 <> t2.TOT1
GROUP BY NVL(t1.AK,t2.AK)