【问题标题】:Minus query / operator in OracleOracle 中的减号查询/运算符
【发布时间】:2014-12-07 06:35:00
【问题描述】:

我正在开发一个 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;

【问题讨论】:

  • YEARNR 和 YEAR_NR 有什么区别?
  • 执行查询时发生了什么?它没有给你想要的输出吗?
  • @Multisync、YEARNR 和 YEAR_NR 是我的错误。必须是 YEARNR。
  • @wasabi 我也是这么想的,但我认为这没有错。如果是的话,会有很大的不同。另外,告诉它不需要显示一个变量,它必须只有一个值。
  • MINUS 会起作用,就像我在回答中建议的那样。

标签: sql oracle oracle11g


【解决方案1】:
SELECT CCYCD
     , YEARNR
  FROM CCYEXC
 WHERE YEAR_NR = 2014
   AND CCYCD,YEARNR NOT IN 
           (
      SELECT CCYCD
           , YEARNR
        FROM CCYEXC
       WHERE YEAR_NR = 2013 
           );

【讨论】:

  • 我想你忘了括号
  • 对不起,语法不起作用。错误为无效的关系运算符。
  • 我无法运行它,但正如 Multisync 提到的,它可能会错过括号。他说哪个行号有错误?
【解决方案2】:

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

以下集合操作可用。

  • 联合(全部)
  • 相交
  • 减号/除外

【讨论】:

  • “其他”数据库是什么意思? OP 说:oracle11g
  • MINUS 的使用可能不正确,因为它还消除了结果集中的重复项
  • 应该是这样。这是一个 SET 操作。 SET 不包含重复项
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    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);  
    

    你也可以使用左连接

    MINUS 不起作用,因为两个集合(子查询)具有不同的 YEARNR(它们不相交)

    【讨论】:

    • 不,MINUS 会起作用。不要将年份列放在选择列表中,因为拥有永远不会相交的不同年份是没有意义的。看我的回答。
    • 问题中的 @Lalit Kumar MINUS 不起作用。当然在不同的情况下也可以使用。我刚刚指出问题出在哪里
    【解决方案5】:

    一种更简洁的写法是使用聚合:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-27
      • 2011-06-12
      • 2013-10-11
      • 2015-07-08
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 2021-12-03
      相关资源
      最近更新 更多