2

我有两张桌子,DATA_TABLEERROR_TABLEDATA_TABLE有一列ID有一个 8 位数字。有ERROR_TABLE一列后跟八位数字。KEYidkey=

我不能使用相交,因为元组不同,我不知道如何解决它。

我需要的是找到与列中DATA_TABLE的值ID对应的列中具有值ERROR_TABLEKEY行。

这是一个视觉效果。我需要查看其中哪些匹配并从DATA_TABLE

DATA_TABLE
  ID
  24294857
  19573859
  49205983

ERROR_TABLE
  KEY
  idkey=24294857
  idkey=66849896
  idkey=94697356
4

6 回答 6

3

我会使用一个简单的内部连接

select * 
from DATA_TABLE 
inner join ERROR_COLUMN  
   on DATA_TABLE.ID = ERROR_TABLE.KEY
于 2013-02-22T21:06:18.567 回答
1

类似于 PM 77-1,但使用显式连接:

SELECT *
  FROM DATA_TABLE
  JOIN ERROR_TABLE
    ON 'idkey=' || ID = KEY;

见:http ://sqlfiddle.com/#!4/dbe73/3

于 2013-02-22T21:20:50.587 回答
1
select dt.* 
from data_table dt 
join error_table et 
   on et.idkey = dt.id
于 2013-02-22T21:06:27.040 回答
0

最好的办法是更正错误表中的数据。这些示例将仅剪切文本留下数字。您可以使用 TO_NUMBER() 函数将它们显式转换为数字以加入和比较。您已经有很多连接示例。但在加入之前,您需要将双方转换为数字,以切断数字前面的字符:

-- This example assumes you will always have '=' in your string --
SELECT SUBSTR('idkey=24294857', INSTR('idkey=24294857', '=')+1) digits_only 
  FROM dual
/

SELECT regexp_replace('idkey=24294857','[^0-9]') digits_only 
  FROM dual; 
/

SELECT REGEXP_SUBSTR('idkey=24294857','[[:digit:]]+') AS digits_only FROM dual
/

在此之后,您的查询将比较数字与连接中的数字,这是唯一正确的做法。

于 2013-02-22T21:25:51.643 回答
0

你的意思是这样的吗?

SELECT * FROM DATA_TABLE d, ERROR_TABLE e
WHERE ('idkey='||d.id = e.key)
ORDER BY DATA_TABLE.id
于 2013-02-22T21:07:21.233 回答
0

感谢大家的帮助!

我尝试了每一个建议,但没有任何工作。我对 SQL 非常熟悉,并且只了解一些命令。

最后,我从一位同事那里得到了这个,它完成了我所需要的。现在,我只需要了解它...

SELECT *
FROM DATA_TABLE
WHERE EXISTS 
        (SELECT NULL
           FROM ERROR_TABLE
          WHERE ID = SUBSTR(ERROR_TABLE.KEY,7));
于 2013-02-25T14:53:22.030 回答