[英]Minus query / operator in Oracle
我正在研究Oracle 11g数据库。 我有货币表,在2013年有182条记录,在2014年有81条记录。 我必须从2013年获得101条记录的差异。我必须在2014年插入丢失/差异记录。
我想知道我的语法是不正确的还是任何其他产生差异查询的方法。
SELECT
a.CCYCD,
a.YEARNR
FROM CCYEXC a
WHERE a.YEARNR = 2013
minus
SELECT
a.CCYCD,
a.YEARNR
FROM CCYEXC a
WHERE a.YEARNR = 2014;
SELECT CCYCD
, YEARNR
FROM CCYEXC
WHERE YEAR_NR = 2014
AND CCYCD,YEARNR NOT IN
(
SELECT CCYCD
, YEARNR
FROM CCYEXC
WHERE YEAR_NR = 2013
);
您只需要在MINUS
查询的SELECT
列表中具有CCYCD
列。 现在,要将此结果插入到2014年的表格中,只需编写这样的i sert语句,
INSERT INTO ccyexc
SELECT ccycd, 2014 as "yearnr"
FROM(
<your MINUS query>
);
存在速度通常更快:
SELECT a.CCYCD, a.YEARNR
FROM CCYEXC a
WHERE a.YEARNR = 2013
and not exists (select 1 from CCYEXC b where b.YEARNR = 2014 and b.CCYCD = a.CCYCD);
另外一个选项:
SELECT a.CCYCD, a.YEARNR
FROM CCYEXC a
WHERE a.YEARNR = 2013
and a.CCYCD not in (select distinct CCYCD from CCYEXC b where b.YEARNR = 2014);
您也可以使用LEFT JOIN
MINUS不起作用,因为两个集合(子查询)具有不同的YEARNR(它们不相交)
一种更简单的写法是使用聚合:
SELECT c.CCYCD,
FROM CCYEXC c
GROUP BY c.CCYCD
HAVING SUM(CASE WHEN c.YEARNR = 2013 THEN 1 ELSE 0 END) > 0 AND
SUM(CASE WHEN c.YEARNR = 2014 THEN 1 ELSE 0 END) = 0;
或者,正如其他人所建议的, NOT EXISTS
或NOT IN
子句。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.