2014-12-06 101 views
1

我上的Oracle 11g数据库工作。我有货币表,我在2013年和2014年有182条记录,我有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; 
+0

什么YEARNR和YEAR_NR之间的区别? – Multisync 2014-12-06 21:02:02

+0

执行查询时发生了什么?它没有给你想要的输出? – 2014-12-06 21:32:48

+0

@Multisync,YEARNR和YEAR_NR是我的错误。它必须是YEARNR。 – wasabi 2014-12-06 21:39:25

回答

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

我想你忘记 – Multisync 2014-12-06 21:07:16

+0

谢谢你的帮助!括号 – wasabi 2014-12-06 21:34:49

+0

对不起,语法不起作用。作为无效的关系运算符出错。 – wasabi 2014-12-06 21:38:36

0

你的MINUS用法是正确的。当你想要SET差异时,MINUS是正确的路线。请注意,某些其他数据库使用EXCEPT关键字来执行此操作。

下面一组操作都可用。

  • UNION(ALL)
  • INTERSECT
  • 减号/ EXCEPT
+0

你是什么意思,“其他”数据库?OP说:oracle11g – tvCa 2014-12-06 21:06:05

+0

MINUS的使用可能不正确,因为它也消除了结果集中的dublicates – Multisync 2014-12-06 21:09:25

+0

它应该是这样的。这是一个SET操作。一个SET不保存重复 – 2014-12-06 21:15:46

0

你只需要拥有CCYCD列在SELECT列表中MINUS查询。现在,插入该结果到表中的2014年,只写了我SERT的声明是这样,

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

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

减号不起作用,因为这两套(子查询)有不同的YEARNR(不相交)

+0

不,MINUS将工作。不要将年份列放在选择列表中,因为在不同年份之间不会相交是没有意义的。看看我的答案。 – 2014-12-06 22:01:32

+0

@Lalit Kumar从问题减去不起作用。当然,在不同的情况下,它可以被使用。我刚才指出了问题所在 – Multisync 2014-12-06 22:07:52

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子句。