繁体   English   中英

Oracle中的减号查询/运算符

[英]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的使用是正确的。 当您需要SET差异时,MINUS是正确的选择。 请注意,其他一些数据库对此操作使用EXCEPT关键字。

可以进行以下设定操作。

  • 联盟(全部)
  • 相交
  • 减号/ EXCEPT

您只需要在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 EXISTSNOT IN子句。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM