【问题标题】:Select 1 from dual where exists (select ....). Returns 1 even if the table is completely empty?从存在的对偶中选择 1(选择 ....)。即使表完全为空,也返回 1?
【发布时间】:2014-12-05 04:11:30
【问题描述】:

我正在使用 Select 1 from dual 语句来查看进入我系统的新数据是否真的是新的,如果是新的,那么它将被插入,如果不是,那么它将在数据库。

sql.CommandText = "select 1 from dual where exists (select * from my table where hour = " + hour + " and zone = '" + zone+ "' and date = TO_DATE('" + mydate + "','DD-MM-YY'))"

但问题是,在运行语句后,即使不满足条件,即使表完全为空,它也会返回 1 值。这怎么可能发生? 我正在使用 VB、.NET 框架 3.5 和 Oracle 10g。

【问题讨论】:

  • 为我工作:sqlfiddle.com/#!4/6eb12/7 有没有什么你没有提到的?如果你想做更新/插入,为什么不简单地使用MERGE 语句?
  • 我决定不使用 MERGE 语句,因为我看到的示例更多是关于实际将 2 个表合并为 1 个表,我正在更新/插入的数据来自 XML 文件,而不是来自实际数据库.
  • 您可以轻松地使用具有“常量”值的 MERGE 语句:sqlfiddle.com/#!4/ed4de/6
  • 您确定它返回的结果只有一行,值为1,而不是列名为1 和0 行的结果吗?

标签: vb.net oracle


【解决方案1】:

我会建议类似的东西

SELECT COUNT(*) AS cnt 
  FROM mytable m
 WHERE m.hour = hour 
   AND m.zone = zone
   AND m.date = TO_DATE( mydate,'DD-MM-YY'))
   AND ROWNUM = 1

结果将是 0 或 1。由于您只关心行的存在,ROWNUM = 1 将导致查询在找到匹配条目后立即退出,并阻止您扫描整个表.

【讨论】:

    【解决方案2】:

    您可以使用sign(count(1)) 获取计数。

    select sign(count(1)) cnt 
    from my_table 
    where hour = " + hour + " and zone = '" + zone+ "' 
        and date = TO_DATE('" + mydate + "','DD-MM-YY'))" 
    

    【讨论】:

      猜你喜欢
      • 2021-03-11
      • 2020-02-04
      • 2021-07-27
      • 2012-06-16
      • 1970-01-01
      • 2013-03-20
      • 2015-12-07
      • 2013-08-11
      • 1970-01-01
      相关资源
      最近更新 更多