Oracle中的减号查询/运算符

时间:2014-12-06 20:52:41

标签: sql oracle oracle11g

我正在研究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;

5 个答案:

答案 0 :(得分:0)

SELECT CCYCD
     , YEARNR
  FROM CCYEXC
 WHERE YEAR_NR = 2014
   AND CCYCD,YEARNR NOT IN 
           (
      SELECT CCYCD
           , YEARNR
        FROM CCYEXC
       WHERE YEAR_NR = 2013 
           );

答案 1 :(得分:0)

您对MINUS的使用是正确的。当你想要SET差异时,MINUS是正确的方法。请注意,其他一些数据库使用EXCEPT关键字进行此操作。

以下设定操作可用。

  • UNION(ALL)
  • INTERSECT
  • MINUS /除非

答案 2 :(得分:0)

您只需要在CCYCD查询的SELECT列表中包含MINUS列。现在,要将此结果插入到2014年的表中,只需编写一个这样的i sert语句,

INSERT INTO ccyexc     SELECT ccycd, 2014 as "yearnr"     FROM(        <your MINUS query>     );

答案 3 :(得分:0)

EXISTS通常更快:

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(它们不相交)

答案 4 :(得分:0)

更简单的方法是使用聚合:

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条款。