【问题标题】:Oracle select distinct syntax errorOracle 选择不同的语法错误
【发布时间】:2013-02-28 22:51:13
【问题描述】:

为什么 oracle 不能识别这句话?它说在预期的地方找不到“来自关键字”。它出什么问题了 ?

例子:

select distinct a.id = b.id
from table1 a, table2 b
where a.column = X and b.column =Y;

MySQL 允许我这样做。那么我应该改变什么?

【问题讨论】:

  • 你期待什么结果?
  • 我期待某种布尔结果,这就是我为什么在此处放置“=”符号而不使用a.id, b.id
  • 好吧,我就是这么想的。 Boolean 不是标准的 SQL 数据类型。 MySQL 已经实现了它,但 Oracle 还没有。
  • 是的,这就是我所说的“某种布尔值”。我用 1 和 0 处理它。
  • @APC:实际上boolean 一个标准的SQL数据类型(我认为它是用SQL-99添加的)。 MySQL 确实 notboolean 数据类型 - 只有一个不完全相同的数据类型。 MySQL 在表达式中简单地将零视为false,将任何非零视为true(这与真正的布尔类型完全不同)。这就是为什么(理论上是非法的)语句:delete from foo where 1234 会愉快地从表中删除所有行。

标签: sql oracle boolean


【解决方案1】:

您的问题是 a.id = b.id 在 select 子句中时不是有效的 sql。

在下方编辑

鉴于您对预期布尔结果的评论,也许您正在寻找一个案例构造。

select case when a.id = b.id then 1 else 0 end BooleanResult
from tablea a join tableb b on something
where etc

【讨论】:

    【解决方案2】:

    首先,Oracle 在 SQL 中没有布尔数据类型(PL/SQL 中有布尔数据类型),因此查询不能返回布尔值。

    你可以这样做

    select distinct (case when a.id = b.id 
                          then 1
                          else 0
                      end)
      from table1 a, 
           table2 b
     where a.column = X 
       and b.column = Y;
    

    然而,我觉得非常不可能,你真的想在table1table2 之间做一个笛卡尔积,然后才应用DISTINCT 运算符。当人们真正想要做的是添加另一个连接条件时,通常会错误地将DISTINCT 添加到查询中。我希望你真的想要

    select distinct (case when a.id = b.id 
                          then 1
                          else 0
                      end)
      from table1 a, 
           table2 b
     where a.some_key = b.some_key
       and a.column = X 
       and b.column = Y;
    

    正确定义连接后,您可能不再需要花费额外的DISTINCT

    【讨论】:

      【解决方案3】:

      这里是

      select distinct a.id, b.id
      from table1 a, table2 b
      where a.column = X and b.column =Y;
      

      【讨论】:

        【解决方案4】:

        你也可以在oracle中使用解码

        select distinct (decode (a.id,b.id,1,0)) from table1 a, table2 b
            where a.some_key = b.some_key
            and a.column = X ;
        

        【讨论】:

          猜你喜欢
          • 2019-04-22
          • 2021-02-19
          • 1970-01-01
          • 1970-01-01
          • 2014-03-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-21
          相关资源
          最近更新 更多