sql - Oracle:连接字段的整数值

标签 sql oracle join integer

我意识到我正在使用的数据库中的数据结构还有很多不足之处,但我无法控制这一点,所以请耐心等待。

我有一个字段ADDRESSES.COMPANY,它可能是也可能不是整数ID。有时它是一个字符串。但是,当它是整数时,我想连接到另一个表COMPANIES。原始查询(预连接)如下所示:

SELECT *
  FROM (SELECT ROWNUM AS ROW_NUM, INNERQUERY.*
          FROM (  SELECT *
                    FROM ADDRESSES, COMPANIES
                ) INNERQUERY) OUTERQUERY
 WHERE ROW_NUM <= 50 AND ROW_NUM > 0

如果我尝试正常加入,我会收到错误ORA-01722:无效号码...出于明显的原因(它并不总是尝试加入的号码,或者至少我假设这就是它的意思,因为它是真的!)。尝试加入后我的查询:

SELECT *
  FROM (SELECT ROWNUM AS ROW_NUM, INNERQUERY.*
          FROM (  SELECT *
                    FROM ADDRESSES, COMPANIES
                    WHERE ADDRESSES.COMPANY(+) = COMPANIES.ID
                ) INNERQUERY) OUTERQUERY
 WHERE ROW_NUM <= 50 AND ROW_NUM > 0

我能想到的唯一两个可能的解决方案都是使用 TO_NUMBER() 函数,我认为该函数会将非数字字符串计算为 0。我尝试过:

SELECT *
  FROM (SELECT ROWNUM AS ROW_NUM, INNERQUERY.*
          FROM (  SELECT *
                    FROM ADDRESSES, COMPANIES
                    WHERE TO_NUMBER(ADDRESSES.COMPANY)(+) = COMPANIES.ID
                ) INNERQUERY) OUTERQUERY
 WHERE ROW_NUM <= 50 AND ROW_NUM > 0

错误为ORA-00936:缺少表达式(第 7 行)。我认为我对使用它的适当位置的猜测是不正确的,并尝试了以下方法:

SELECT *
  FROM (SELECT ROWNUM AS ROW_NUM, INNERQUERY.*
          FROM (  SELECT *, TO_NUMBER(ADDRESSES.COMPANY) AS COMPANYID
                    FROM ADDRESSES, COMPANIES
                    WHERE COMPANYID(+) = COMPANIES.ID
                ) INNERQUERY) OUTERQUERY
 WHERE ROW_NUM <= 50 AND ROW_NUM > 0

第 3 行出现 ORA-00923: FROM 关键字未在预期位置找到 错误。

当我的第一次尝试失败时,我确信我的第二次尝试会成功。但我对这个错误感到困惑。我是否对 Oracle 语法和/或行为完全一无所知,还是有其他原因? 我的问题有解决办法吗?

最佳答案

1.

WHERE TO_NUMBER(ADDRESSES.COMPANY)(+) = COMPANIES.ID

你不能这样做。

The (+) operator can be applied only to a column, not to an arbitrary expression. However, an arbitrary expression can contain one or more columns marked with the (+) operator.

JOINS

2.

SELECT *, TO_NUMBER(ADDRESSES.COMPANY) AS COMPANYID
  FROM ADDRESSES, COMPANIES
 WHERE COMPANYID(+) = COMPANIES.ID

您不能在定义此别名的同一范围内通过别名引用列(除非它是 order by 子句)。

在这种情况下执行外连接的正确方法是使用 ansi 连接语法:

select * 
  from companies
  left join addresses on companies.id = addresses.companyid

在字符串列上使用 to_number 没有多大意义,因为它会在连接过程中遇到的第一个非数字值上产生相同的无效数字错误。

但是,您可以尝试将数字转换为字符,正如建议的那样。

  select * 
      from companies
       left join addresses 
         on to_char(companies.id) = addresses.companyid

但是您必须记住,这可能会降低您的性能,因为每当您转换列时您将无法使用索引。

关于sql - Oracle:连接字段的整数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13743209/

相关文章:

mysql - 使用 GROUP_CONCAT 重复值而不在具有多个连接的 MySQL 查询上使用 DISTINCT

sql - AWS Athena 从选择查询创建表

mysql - 当表2值不存在时,从表1中获取记录并从另一个表中加入它

mysql查询,从3个表中选择

java - Oracle 数据库 SELECT ... FOR UPDATE 自动提交

java - 安全地包装连接池

mysql - 多对多加入

mysql - 在 MySQL 函数调用中使用 Select 语句

Mysql::Error: 指定的键太长;最大 key 长度为 1000 字节

Oracle:如何对 XMLType 进行全文搜索?