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" 连接。要获得外部联接,必须在其前面加上关键字 LEFT
、RIGHT
或 FULL
。要允许 "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)
更新:
我正在努力做到这一点,
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" 连接。要获得外部联接,必须在其前面加上关键字 LEFT
、RIGHT
或 FULL
。要允许 "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)